Помещение :
#include <iostream>
using namespace std;
class ABC {
public:
ABC() {
cout << "Default constructor ..\n";
}
ABC(const ABC& a) {
cout << "In copy constrcutor ..\n";
}
ABC(ABC&& aa) = delete;
};
int main(int argc, char* argv[]) {
ABC b{ABC{}};
return 0;
}
Скомпилируйте это с GCC против Clang
Clang - Apple LLVM version 8.1.0 (clang-802.0.42)
Gcc - 5.4.0 ubuntu
Наблюдение Кланг жалуется на удаленный конструктор Move.
Gcc вообще не жалуется.И будет выводить правильно.
Вопрос Почему?
Для gcc я знаю, что если вы просто инициализируете и lvalue, и rvalue, он оптимизирует и фактически не вызываетСкопируйте конструктор и скопируйте временное значение в lvalue.
Почему Clang отличается?Я думал (не уверен, поэтому вопрос) это было в стандарте C ++, который отклонился (или нет)?Или я что-то не так делаю.
Команда компиляции : g++ --std=c++11 -O3 file.cpp
Для дополнительного удовольствия удалите фигурные скобки и вместо них поставьте скобки;)
ABC b{ABC{}};
до, ABC b(ABC());
, не относится к этому вопросу.
РЕДАКТИРОВАТЬ : Кто-то пометил вопрос как дуплекс, но это не так.Я четко заявляю, что считаю, что стандарт C ++ 11 включает в себя разрешение на копирование.Тем не менее, CLANG, похоже, не имеет такого же поведения в отношении чего-то столь же важного, как конструкторы.
ЗДЕСЬ ССЫЛКА: http://en.cppreference.com/w/cpp/language/copy_elision
явно , он говорит C ++11.Я доверяю cppref.