почему лямбда вылетает на лязг, а не на gcc?

эта программа вылетает с лязгом

#include <iostream>
#include <string>
#include <mutex>
#include <functional>

int main(int argc, char **argv)
{
auto m = std::function<void()>( [](){
int r = std::rand() % 100;
if (r < 50)
{
return r; //should not return
}
});
for(int i=0;i<100;i++)
m();
return 0;
}

доклады:

pt@test$ clang++ -o test test1.cpp  -std=c++11
test1.cpp:14:5: warning: control may reach end of non-void lambda [-Wreturn-type]
});
^
1 warning generated.
pt@test$ ./test
Illegal instruction (core dumped)

но это не терпит крах с g++,

Мое замешательство в том, что, поскольку это приведет к сбою, почему бы и нет clang рассматривать это как ошибку при компиляции?


Обновить

рассмотрите следующий код

auto lMayNotReturn = []() {
int rValue = std::rand() % 100;
if (rValue < 50)
{
return rValue; //should not return
}
std::cout << "   non-return rValue: " << rValue << std::endl;
};
for(int i=0 ; i< 30;i++){
int rValue= lMayNotReturn();
std::cout << "random value " << rValue << " ";
if (rValue >= 50) {
std::cout << " ???undefined???";
}
std::cout << std::endl;
}
std::cout << "end--------" << std::endl;

цели, созданные gcc & visual studio продолжит работать и вернется случайные значения как

 pt@DESKTOP-S54JIQA:/mnt/e/Projects/uv_test$ ./test
non-return rValue: 83
random value 6295680  ???undefined???
non-return rValue: 86
random value 6295680  ???undefined???
non-return rValue: 77
random value 6295680  ???undefined???

Подобные ошибки гораздо сложнее отследить, чем просто сбои и лягушки.

Единственная причина clang не выдвигать ошибку, о которой я могу думать, это совместимость.

1

Решение

Потому что это неопределенное поведение. За заявление о возврате:

Выход из конца функции, возвращающей значение (кроме main) без оператора return, является неопределенным поведением.

Это означает, что компиляторы могут делать все что угодно; они не обязаны давать ошибку (или нет).

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]