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 работает правильно.
Здравствуйте, Кодт, Вы писали:
К>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
некоторые извращенцы специально вызывают несколько функций через запятую и реазультат всегда в таком выражении после последней запятой
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).
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>а что тут странного? а вот так было бы понятнее?
Возможно, что компилятор VS2012 самостоятельно подвёрстывает лишние скобки в абстрактное синтаксическое дерево для единообразия с каким-нибудь другим похожим узлом.
Например, чтобы единообразно обрабатывать new T, new T(), new T(x).
Причём, скорее всего, это делается исключительно для встроенных типов (а, может быть, и для всех POD-ов — тут надо поэкспериментировать).
Потому что new T(x,y,z) для типов с пользовательскими конструкторами — это не то же самое, что new T((x,y,z)) == new T(z).
Но это маленькие футбольные хитрости (с) Маслаченко.