Здесь кусок кода 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()
), но не о столь простых выражениях объявлений. Конечно, это может быть неприятно .Ответы:
Заявление:
эквивалентно:
Другими словами, он объявляет переменную с именем
i
типаT
. Это связано с тем, что в некоторых местах в объявлениях допускаются скобки (для изменения привязки объявлений), и поскольку этот оператор может быть проанализирован как объявление, он является объявлением (даже если он может иметь больше смысла как выражение).источник
int(i)
также объявляетсяint
именованныйi
?Вы можете использовать Compiler Explorer, чтобы увидеть, что происходит в ассемблере.
Вы можете видеть, что # 1, # 2 # 4 и # 5 делают то же самое, но странно # 3 вызывают другой конструктор (конструктор базового объекта).
У кого-нибудь есть объяснение?
Код ассемблера:
источник