Здесь кусок кода C ++.
В этом примере многие блоки кода выглядят как вызовы конструктора. К сожалению, блочного кода № 3 нет (это можно проверить с помощью https://godbolt.org/z/q3rsxn и https://cppinsights.io ).
Я думаю, что это старая нотация C ++, и она может объяснить введение новой нотации конструкции C ++ 11 с использованием {} (cf # 4).
У вас есть объяснение T(i)значения, настолько близкое к обозначению конструктора, но определенно такое отличающееся?
struct T {
T() { }
T(int i) { }
};
int main() {
int i = 42;
{ // #1
T t(i); // new T named t using int ctor
}
{ // #2
T t = T(i); // new T named t using int ctor
}
{ // #3
T(i); // new T named i using default ctor
}
{ // #4
T{i}; // new T using int ctor (unnamed result)
}
{ // #5
T(2); // new T using int ctor (unnamed result)
}
}
NB: таким образом, T(i)(# 3) эквивалентно T i = T();
-Wallи вы получите " warning: parentheses were disambiguated as redundant parentheses around declaration of variable named 'i' [-Wvexing-parse]" из clang или чуть менее мотивированный " warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]" из gcc .
T t()), но не о столь простых выражениях объявлений. Конечно, это может быть неприятно .