Tôi đang gặp rắc rối với đoạn mã sau:phá vỡ cấu trúc lồng nhau constexpr mặc dù là giống hệt nhau cho những người toàn cầu
template<typename T>
constexpr int get(T vec) {
return vec.get();
}
struct coord {
constexpr int get() const { return x; }
int x;
};
struct foo {
struct coord2 {
constexpr int get() const { return x; }
int x;
};
constexpr static coord f = { 5 };
constexpr static int g = get(f); // works
constexpr static coord2 h = { 5 };
constexpr static int i = get(h); // doesn't work
};
constexpr coord foo::f;
constexpr foo::coord2 foo::h;
int main(){}
Về cơ bản, get(f)
được coi là một biểu hiện thường xuyên, nhưng không phải là get(h)
. Điều duy nhất thay đổi là một trong những sử dụng một cấu trúc toàn cầu coord
, trong khi khác sử dụng một cấu trúc lồng nhau coord2
. Các cấu trúc ' ' của cấu trúc giống hệt nhau.
Tại sao điều này?
GCC lỗi:
test.cpp:20:35: error: field initializer is not constant
Clang lỗi:
test.cpp:20:26: error: constexpr variable 'i' must be initialized by a constant expression
constexpr static int i = get(h); // doesn't work
^ ~~~~~~
test.cpp:8:10: note: undefined function 'get' cannot be used in a constant expression
return vec.get();
^
test.cpp:20:30: note: in call to 'get({5})'
constexpr static int i = get(h); // doesn't work
^
test.cpp:13:21: note: declared here
constexpr int get() const { return x; }
@dyp: Đó không phải là những gì tôi nói? (Nó được suy ra, nó không phải là rõ ràng) –
Ah, OK, tôi hiểu lầm đoạn đó, xin lỗi. – dyp