Предупреждение C4239: nonstandard extension used

188
15 декабря 2017, 03:26
class A
{
public:
    typedef std::shared_ptr<A> Ptr;
};
void f(A::Ptr&)
{
}
int main() 
{
    f(A::Ptr(new A));
}

Почему возникает предупреждение

warning C4239: nonstandard extension used: 'argument': conversion from 'std::shared_ptr' to 'A::Ptr &'

А если сделать так то предупреждение не возникает:

int main() 
{
    A::Ptr a(new A);
    f(a);
} 

Как такое использование может привести к ошибке?

Answer 1

Функция описана как получающая неконстантную ссылку, а передаете вы в нее временное значение (грубо говоря, rvalue). VC++ разрешает такие действия, но именно как нестандартное расширение.

Во втором случае вы передаете ссылку на переменную, т.е. ссылку на lvalue.

Не думаю, что в функции вы как-то меняете входную ссылку - иначе какой смысл передавать в нее временный объект? - так что можете написать

void f(const A::Ptr&)

Это позволит не прибегать к нестандартным расширениям.

READ ALSO
Как задать граф в языке C++ (Призма Мебиуса)

Как задать граф в языке C++ (Призма Мебиуса)

Здравствуйте, как задать такой граф в языке C++?

170
Что такое компаратор?

Что такое компаратор?

В вопросе Поиск самой длинной строки я увидел слово компаратор, но поскольку я мало понимаю в программировании, то я не знаю что это может...

217
Unit test для синглтона

Unit test для синглтона

Всем привет! Понимаю, что сам вопрос звучит довольно глупо, но столкнулся с такой задачейНужно сделать Юнит тесты для класса являющимся синглтоном,...

161
Как данные отослать в нужный Endpoint

Как данные отослать в нужный Endpoint

Нужно отослать данные Usb девайсу в нужный EndpointРаботаю с устройством как с файлом, WriteFile ReadFile

161