powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача по ссылке не l-значения.
12 сообщений из 12, страница 1 из 1
Передача по ссылке не l-значения.
    #39191058
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Должна ли тут быть ошибка компиляции при вызовы 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
Передача по ссылке не l-значения.
    #39191272
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно

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


Код: 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
Передача по ссылке не l-значения.
    #39191276
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, int create_l(); разумеется, а не int& create_l();

зы: у меня у одного не вываливается список цветов, когда нажимаешь на COLOR?
...
Рейтинг: 0 / 0
Передача по ссылке не l-значения.
    #39191775
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.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
Передача по ссылке не l-значения.
    #39191835
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

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

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

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

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

Ничего странного, VC не лучший в мире компилятор в плане совместимости со стандартом.
...
Рейтинг: 0 / 0
Передача по ссылке не l-значения.
    #39191973
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Передача по ссылке не l-значения.
    #39191989
.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
Передача по ссылке не l-значения.
    #39192122
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.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
Передача по ссылке не l-значения.
    #39193032
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.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
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача по ссылке не l-значения.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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