int* p;
// вот так - задумано
p = new int(1); // new int(1)
p = new int(12.34); // new int(12)
p = new int("wtf"); // ошибка компиляции
// а вот так - внезапно!
p = new int(1,2,3); // new int(3) !
p = new int(1,2,3.4); // new int(3) - т.е. static_cast
p = new int(1,2,"wtf"); // new int((int)"wtf") - т.е. reinterpret_cast
p = new int(foo(),bar(),buz(),"wtf"); // выполняет foo(), bar(), buz(), отдаёт new int((int)"wtf")
gcc совершенно справедливо ругается во всех случаях, кроме первых двух.
UPD. VS2012. На 2013 там ICE, на 2015 работает правильно.
main.cpp(26): fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'f:\dd\vctools\compiler\cxxfe\sl\p1\c\trees.h', line 588)
To work around this problem, try simplifying or changing the program near the locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Забавно, что в Visual Studio 2013 Update 4 упоминаемая строка в файлике trees.h имеет номер уже 589.
В Visual Studio 2015 этот баг, похоже, поправили: ошибки также выдаются во всех случаях, кроме первых двух (свежайшая версия Visual C++ 19.0 доступна онлайн на http://rise4fun.com/vcpp).
Здравствуйте, Constructor, Вы писали:
C>Visual Studio 2013 (w/o updates) выдает internal compiler error, если закомментировать строчку p = new int("wtf");: C>Забавно, что в Visual Studio 2013 Update 4 упоминаемая строка в файлике trees.h имеет номер уже 589.
Сейчас проверил — оказывается, да: VS2012 (она же 11.0, компилятор 17.00) молча хавает, а 2013 (12.0 / 18.00) update 3 даёт айс в строке 588.
C>В Visual Studio 2015 этот баг, похоже, поправили: ошибки также выдаются во всех случаях, кроме первых двух (свежайшая версия Visual C++ 19.0 доступна онлайн на http://rise4fun.com/vcpp).
Здравствуйте, Кодт, Вы писали:
К>p = new int(1,2,3); // new int(3) ! К>p = new int(1,2,3.4); // new int(3) — т.е. static_cast К>p = new int(1,2,"wtf"); // new int((int)"wtf") — т.е. reinterpret_cast К>p = new int(foo(),bar(),buz(),"wtf"); // выполняет foo(), bar(), buz(), отдаёт new int((int)"wtf")
а что тут странного? а вот так было бы понятнее?
p = new int((1,2,3)); // new int(3) !
p = new int((1,2,3.4)); // new int(3) — т.е. static_cast
p = new int((1,2,"wtf")); // new int((int)"wtf") — т.е. reinterpret_cast
p = new int((foo(),bar(),buz(),"wtf")); // выполняет foo(), bar(), buz(), отдаёт new int((int)"wtf
некоторые извращенцы специально вызывают несколько функций через запятую и реазультат всегда в таком выражении после последней запятой
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>а что тут странного? а вот так было бы понятнее?
Возможно, что компилятор VS2012 самостоятельно подвёрстывает лишние скобки в абстрактное синтаксическое дерево для единообразия с каким-нибудь другим похожим узлом.
Например, чтобы единообразно обрабатывать new T, new T(), new T(x).
Причём, скорее всего, это делается исключительно для встроенных типов (а, может быть, и для всех POD-ов — тут надо поэкспериментировать).
Потому что new T(x,y,z) для типов с пользовательскими конструкторами — это не то же самое, что new T((x,y,z)) == new T(z).
Но это маленькие футбольные хитрости (с) Маслаченко.