2016-11-17 17 views

Trả lời

21

Một static constexpr sẽ ngầm cũng được inline, nếu không bạn sẽ cần phải đánh dấu nó như inline

template<typename T> 
struct SomeClass { 
    inline static T test; // Now inline 
}; 

struct SomeClass2 { 
    static constexpr int test = 9; // inline 
}; 

CFR. từ n4606 [depr.static_constexpr]

Đối với khả năng tương thích với tiêu chuẩn quốc tế trước khi C++, một constexpr tĩnh thành viên dữ liệu có thể dư thừa redeclared bên ngoài lớp không có initializer. Việc sử dụng này không được chấp nhận.

Ví dụ:

struct A { 
    static constexpr int n = 5; // definition (declaration in C++ 2014) 
}; 
const int A::n; // redundant declaration (definition in C++ 2014) 

[dcl.constexpr] (Barry đánh bại tôi vào nó)

Một chức năng hoặc thành viên dữ liệu tĩnh khai báo với specifier constexpr là ngầm một hàm nội tuyến hoặc biến (7.1 .6).

11

Từ [dcl.constexpr]:

Một chức năng hoặc thành viên dữ liệu tĩnh khai báo với specifier constexpr là ngầm một hàm nội tuyến hoặc biến (7.1.6).

Không có ngụ ý như vậy inline cho thành viên dữ liệu tĩnh (không constexpr) của mẫu lớp học. Tuy nhiên, trong C++ 17, chúng tôi bây giờ có thể đánh dấu các biến mình là inline, [dcl.inline]:

Một khai báo biến với một specifier inline tuyên bố một biến nội tuyến.

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