다음 코드는 합법입니까?
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은 수락하지만 GCC 및 MSVC는 거부합니다.
GCC의 오류는 다음과 같습니다
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];
| ^~
이런 종류의 코드가 정상이라면 index_sequence
s의 사용을 상당히 줄일 수 있습니다.
1
Gcc10도 받아들입니다.
—
songyuanyao
MSVC에서 오류를 기록 할 수 있습니까?
—
max66
... 그리고 GCC도.
—
평균
@songyuanyao-g ++ 10 컴파일 C ++ 20; C ++ 17 이상 컴파일을 거부합니다. 요점은
—
max66
_v
C ++ 17까지 초기화 목록에서 초기화 해야하는 것으로 보입니다 . 아마도 C ++ 20에서 뭔가 바뀌었을 것입니다.
이 연타가 정적 스토리지 기간 객체가 좋아,이 객체가 기본-초기화되었을 수도 있습니다 "말을 제로로 가져옵니다의"인식 "을 사용하지만 읽 제안 할 수 있기 때문, 실제로 흥미로운 @Evg
—
궤도에서 경량 경주
int
멤버가 정의되지 않은 동작을하지 않습니다 ". 나는 GCC가 그것을 따르지 않는지 , 아니면 다른 방법 인지 궁금합니다 .