Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача по ссылке не l-значения. / 12 сообщений из 12, страница 1 из 1
14.03.2016, 07:31
    #39191058
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача по ссылке не l-значения.
Должна ли тут быть ошибка компиляции при вызовы foo1 из-за того, что в качестве ссылки передаётся не l-значение?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
vector<int> foo()
{
	vector<int> v;
	return v;
}

void foo1(vector<int>& v)
{
	sort(v.begin(), v.end());
}

int main()
{
	foo1(foo());

	return 0;
}
...
Рейтинг: 0 / 0
14.03.2016, 12:35
    #39191272
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача по ссылке не l-значения.
конечно

давай представим что проиходит


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
int some=1;
void foo_r(int& s);
void foo_l(int&& s); // move here..
int create_l();

int main(int,char**) {
  foo_r(some); // ok - some существует здесь и в функции foo_r он будет существовать
  foo_l(create_l()); // ok - то значение, которое будет переданно в foo_l будет туда перемещено и уничтожанно в ней
  foo_r(creaet_l()): // error - значение будет уничтоженно сразу после его возращение, а на это несуществующее значение
                     // будет переданна ссылка в roo_r - компилятор не должен такого допустить.. вот указатель наверное можно
  return 0;
}
...
Рейтинг: 0 / 0
14.03.2016, 12:41
    #39191276
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача по ссылке не l-значения.
ой, int create_l(); разумеется, а не int& create_l();

зы: у меня у одного не вываливается список цветов, когда нажимаешь на COLOR?
...
Рейтинг: 0 / 0
14.03.2016, 21:09
    #39191775
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача по ссылке не l-значения.
.NET,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <vector>
#include <algorithm>

std::vector<int> foo()
{
  return std::vector<int>();
}

void foo1( std::vector<int>& v )
{
  sort( v.begin(), v.end() );
}

int main()
{
  foo1( foo() );
  return 0;
}




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
ziv@mole:~/x/cpp$ g++ b.cpp 
b.cpp: In function ‘int main()’:
b.cpp:16:15: error: invalid initialization of non-const reference of type ‘std::vector<int>&’ from an rvalue of type ‘std::vector<int>’
   foo1( foo() );
               ^
b.cpp:9:6: error: in passing argument 1 of ‘void foo1(std::vector<int>&)’
 void foo1( std::vector<int>& v )
      ^


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
ziv@mole:~/x/cpp$ g++ -std=c++11 b.cpp 
b.cpp: In function ‘int main()’:
b.cpp:16:15: error: invalid initialization of non-const reference of type ‘std::vector<int>&’ from an rvalue of type ‘std::vector<int>’
   foo1( foo() );
               ^
b.cpp:9:6: error: in passing argument 1 of ‘void foo1(std::vector<int>&)’
 void foo1( std::vector<int>& v )
      ^
...
Рейтинг: 0 / 0
14.03.2016, 23:30
    #39191835
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача по ссылке не l-значения.
MasterZiv,

Не компилирует у вас.
Да, по идее и не должно, но Visual Studio 2013 Express почему-то компилирует.
...
Рейтинг: 0 / 0
15.03.2016, 03:44
    #39191871
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача по ссылке не l-значения.
По моему терминология value в последнем стандарте расширена, это точно именно r-value ? Странно что компилирует, вопросы такого характера разве не должны решаться на уровне компилятора ?
...
Рейтинг: 0 / 0
15.03.2016, 09:43
    #39191928
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача по ссылке не l-значения.
.NETMasterZiv,

Не компилирует у вас.
Да, по идее и не должно, но Visual Studio 2013 Express почему-то компилирует.

Это как бы классический случай, за который ругают MSVC.
Ну не могут они, много кода старого...

Возможно, Если включить какой то режим нового стандарта, то тоже не будет компиляться.
...
Рейтинг: 0 / 0
15.03.2016, 09:44
    #39191929
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача по ссылке не l-значения.
SashaMercuryПо моему терминология value в последнем стандарте расширена, это точно именно r-value ? Странно что компилирует, вопросы такого характера разве не должны решаться на уровне компилятора ?

Ничего странного, VC не лучший в мире компилятор в плане совместимости со стандартом.
...
Рейтинг: 0 / 0
15.03.2016, 10:45
    #39191973
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача по ссылке не l-значения.
MasterZiv.NETMasterZiv,

Не компилирует у вас.
Да, по идее и не должно, но Visual Studio 2013 Express почему-то компилирует.

Это как бы классический случай, за который ругают MSVC.
Ну не могут они, много кода старого...

Возможно, Если включить какой то режим нового стандарта, то тоже не будет компиляться.
Покопался в настройках не нашёл где такой режим включается.
Если поставить Уровень предупреждений 4, то выдаётся вот такое предупреждение
авторПредупреждение 1 warning C4239: нестандартное расширение: аргумент: преобразование "std::vector<int,std::allocator<_Ty>>" в "std::vector<int,std::allocator<_Ty>> &" main.cpp 23 1 L_valueTest
...
Рейтинг: 0 / 0
15.03.2016, 10:55
    #39191989
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача по ссылке не l-значения.
Если установить настройку "C\C++ -> Язык -> Отключить расширения языка" в "Да", то компилятор выдаёт ошибку
авторОшибка 1 error C2664: "void foo1(std::vector<int,std::allocator<_Ty>> &)": невозможно преобразовать аргумент 1 из "std::vector<int,std::allocator<_Ty>>" в "std::vector<int,std::allocator<_Ty>> &" main.cpp 23 1 L_valueTest


Но это всё равно немного не то. Он ругается на преобразование типов, а не на то что передаётся r-значение в качестве ссылки.
...
Рейтинг: 0 / 0
15.03.2016, 12:11
    #39192122
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача по ссылке не l-значения.
.NET,

MSVC2003

main.cpp|19|warning C4239: nonstandard extension used : 'argument' : conversion from 'rvalue' to 'rvalue &'|


Хотя лично я не понимаю сути проблемы - объект вполне себе существует на стеке
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <iostream>

using namespace std;

class rvalue
{
public:
    rvalue(){};
    void foo()  { cout << "foo"; }
};

void globalFoo( rvalue& f)
{
    f.foo();
}

int main()
{
    globalFoo(rvalue());
    return 0;
}
...
Рейтинг: 0 / 0
16.03.2016, 10:58
    #39193032
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача по ссылке не l-значения.
.NETЕсли установить настройку "C\C++ -> Язык -> Отключить расширения языка" в "Да", то компилятор выдаёт ошибку
авторОшибка 1 error C2664: "void foo1(std::vector<int,std::allocator<_Ty>> &)": невозможно преобразовать аргумент 1 из "std::vector<int,std::allocator<_Ty>>" в "std::vector<int,std::allocator<_Ty>> &" main.cpp 23 1 L_valueTest


Но это всё равно немного не то. Он ругается на преобразование типов, а не на то что передаётся r-значение в качестве ссылки.

не, это именно оно и есть, самое то. просто сообщение неудачное .
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача по ссылке не l-значения. / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]