Đây là một đoạn mã C ++.
Trong ví dụ này, nhiều khối mã trông giống như các lệnh gọi của hàm tạo. Thật không may, mã khối # 3 không phải (Bạn có thể kiểm tra nó bằng cách sử dụng https://godbolt.org/z/q3rsxn và https://cppinsights.io ).
Tôi nghĩ rằng, đó là một ký hiệu C ++ cũ và nó có thể giải thích việc giới thiệu ký hiệu xây dựng C ++ 11 mới bằng cách sử dụng {} (cf # 4).
Bạn có một lời giải thích cho T(i)
ý nghĩa, rất gần với một ký hiệu xây dựng, nhưng chắc chắn rất khác nhau?
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: do đó, T(i)
(# 3) tương đương với T i = T()
;
-Wall
và bạn nhận được " warning: parentheses were disambiguated as redundant parentheses around declaration of variable named 'i' [-Wvexing-parse]
" từ tiếng kêu, hoặc " warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
" ít động lực hơn " từ gcc .
T t()
) nhưng không phải là biểu thức khai báo đơn giản như vậy. Để chắc chắn, điều này có thể là bực tức .