2016-04-26 18 views
6
struct rgb_color { 
    constexpr rgb_color(std::uint8_t nr, std::uint8_t ng, std::uint8_t nb) : 
     r(nr), g(ng), b(nb) { } 

    std::uint8_t r; // red 
    std::uint8_t g; // green 
    std::uint8_t b; // blue 

    constexpr static rgb_color black = rgb_color(0, 0, 0); 
    constexpr static rgb_color white = rgb_color(255, 255, 255); 
}; 

Các constexpr static định nghĩa liên tục thất bại trong việc biên dịch:Struct là phi nghĩa đen loại

constexpr variable cannot have non-literal type 'const rgb_color' 

Tuy nhiên theo http://en.cppreference.com/w/cpp/concept/LiteralType, const rgb_color nên là một loại đen, bởi vì nó chỉ có loại đen như các thành viên dữ liệu (std::uint8_t) và nhà xây dựng constexpr.

Tại sao mã không biên dịch?

Ngoài ra, nó là cần thiết để xác định constexpr static thành viên trong một tập tin .cc, như

constexpr rgb_color rgb_color::black; 
+0

Nó có hoạt động nếu bạn làm 'constexpr static rgb_color black (0, 0, 0);'? – Sean

+0

Không: http://coliru.stacked-crooked.com/a/f7915407bb464659 – tmlen

+0

Liên kết bạn đưa ra có đề xuất: "có thể cv đủ điều kiện (C++ 17)". Trình biên dịch của bạn có thể được phát bởi các quy tắc C++ 14 ở đây. – MSalters

Trả lời

14

này không làm việc, bởi vì bạn đang instantiating một kiểu dữ liệu muốn không đầy đủ tuyên bố chưa (bạn chưa đạt đóng dấu ngoặc và dấu chấm phẩy nào được nêu ra, vì vậy rgb_color vẫn là một loại không đầy đủ).

Bạn có thể làm việc này bằng cách tuyên bố hằng của bạn ra khỏi lớp, có lẽ trong không gian tên riêng của họ:

namespace rgb_color_constants { 
    constexpr static rgb_color black = rgb_color(0, 0, 0); 
    constexpr static rgb_color white = rgb_color(255, 255, 255); 
} 
2

Tại sao không này?

struct rgb_color { 
    constexpr rgb_color(std::uint8_t nr, std::uint8_t ng, std::uint8_t nb) : 
     r(nr), g(ng), b(nb) { } 

    std::uint8_t r; // red 
    std::uint8_t g; // green 
    std::uint8_t b; // blue 

    static const rgb_color black; 
    static const rgb_color white; 
}; 

const rgb_color rgb_color::black {0, 0, 0}; 
const rgb_color rgb_color::white {255, 255, 255}; 
+1

'const' không phải là' constexpr' – chi

+0

@chi Đúng. Lợi ích của 'constexpr' trong trường hợp này là gì? – ZDF

+0

Điều đó sẽ không hoạt động trong các biểu thức yêu cầu biểu thức liên tục. Ví dụ: 'constexpr auto dummy = rgb_color :: black {}'. – edmz

3

Bạn sẽ có thể để làm cho blackwhite vào static constexpr chức năng - tức là. đây là một ví dụ về "thành ngữ được đặt tên-constructor".

struct rgb_color { 
    constexpr rgb_color(std::uint8_t nr, std::uint8_t ng, std::uint8_t nb) : 
    r(nr), g(ng), b(nb) { } 

    std::uint8_t r; // red 
    std::uint8_t g; // green 
    std::uint8_t b; // blue 

    constexpr static rgb_color black() { return rgb_color(0, 0, 0); } 
    constexpr static rgb_color white() { return rgb_color(255, 255, 255); } 
}; 
Các vấn đề liên quan