6

Hãy xem xét các đoạn mã sau:Anonymous khấu trừ là tạm thời và lớp mẫu luận - gcc vs kêu vang

template <typename T> 
struct foo 
{ 
    foo(T) { } 
}; 

int main() 
{ 
    foo{0}; 
} 

g ++ 7 hạnh phúc tạo ra một đối tượng tạm thời loại foo, suy luận T = int.

kêu vang ++ 5 và 6 từ chối để biên dịch mã:

error: expected unqualified-id 
    foo{0}; 
    ^

live example on wandbox


Đây có phải là một lỗi kêu vang, hoặc là có cái gì đó trong tiêu chuẩn đó ngăn ngừa khấu trừ đối số mẫu lớp từ khởi động cho tạm thời chưa được đặt tên es?

Trả lời

6

Clang lỗi (#34091)

Từ [dcl.type.class.deduct]:

Một giữ chỗ cho một kiểu lớp suy luận cũng có thể được sử dụng trong [...] hay như đơn giản-type-specifier trong một số explicit type conversion (functional notation). Trình giữ chỗ cho loại lớp suy luận sẽ không xuất hiện trong bất kỳ ngữ cảnh nào khác. [Ví dụ:

template<class T> struct container { 
    container(T t) {} 
    template<class Iter> container(Iter beg, Iter end); 
}; 

template<class Iter> 
container(Iter b, Iter e) -> container<typename std::iterator_traits<Iter>::value_type>; 
std::vector<double> v = { /* ... */ }; 

container c(7);       // OK, deduces int for T 
auto d = container(v.begin(), v.end()); // OK, deduces double for T 
container e{5, 6};      // error, int is not an iterator 

- end dụ]

Các vấn đề liên quan