Mã sau đây có hợp pháp không?
template <int N>
class foo {
public:
constexpr foo()
{
for (int i = 0; i < N; ++i) {
v_[i] = i;
}
}
private:
int v_[N];
};
constexpr foo<5> bar;
Clang chấp nhận nó, nhưng GCC và MSVC từ chối nó.
Lỗi của GCC là:
main.cpp:15:18: error: 'constexpr foo<N>::foo() [with int N = 5]' called in a constant expression
15 | constexpr foo<5> bar;
| ^~~
main.cpp:4:15: note: 'constexpr foo<N>::foo() [with int N = 5]' is not usable as a 'constexpr' function because:
4 | constexpr foo()
| ^~~
main.cpp:4:15: error: member 'foo<5>::v_' must be initialized by mem-initializer in 'constexpr' constructor
main.cpp:12:9: note: declared here
12 | int v_[N];
| ^~
Nếu loại mã này ổn, tôi có thể cắt giảm một vài cách sử dụng index_sequence
s.
_v
nên được khởi tạo trong danh sách khởi tạo, cho đến C ++ 17. Có lẽ đã thay đổi một cái gì đó trong C ++ 20.
int
thành viên của nó sẽ không bao giờ có hành vi không xác định ". Tôi tự hỏi liệu GCC không làm điều đó có tuân thủ hay không, hay ngược lại ...