2017-04-14 4 views
11

내가 컴파일되지 않은 몇 가지 코드에 대한 몇 가지 테스트를하고 있었다을에서 작동하고,이 코드 발견 :에 (암시 삭제 기본 생성자는 C++ 14

struct A { 
    A(int) {}; 
    virtual void foo() = 0; 
}; 

struct B : public virtual A { 
    virtual void bar() = 0; 
}; 

struct C : public B { 
    C() : A(1) {} 
    virtual void foo() override {} 
    virtual void bar() override {} 
}; 

int main() { 
    C c; 
    return 0; 
} 

C++ 11에서 컴파일 실패 g ++ 7.0.1)에서 ‘B::B()’ is implicitly deleted because the default definition would be ill-formed으로, C++에서는 14가 성공적으로 컴파일됩니다.

나는이 C++ 14의 새로운 기능이 작동하도록 허용했는지 찾아 보려고 노력했지만 아무런 효과가 없습니다. cppreference에있는 description은 보이는 것 중 아무 것도 언급하지 않습니다.

이 코드는 C++ 14에서는 컴파일 할 수 있지만 C++ 11에서는 컴파일 할 수없는 이유는 무엇입니까?

+0

Clang의 C++ 11 (및 C++ 03) 모드에서 작동합니다. GCC의 버그일까요? –

+0

@JosephThomson 나는 Clang에서 그것을 테스트하지 않았다는 것을 인정했다. 실제로 C++ 03 모드에서'g ++ '에서도 작동합니다. 그래서 어쩌면 나는 버그 보고서를 열어야 만한다. – Svalorzen

+0

누군가가 당신의 질문에 대한 답을 줄 수 있을지에 달려있다! –

답변

1

분명히 gcc 7의 버그입니다. gcc 7+가 포함 된 온라인 컴파일러에서 코드를 체크 아웃하면 아무 문제없이 완벽하게 작동하기 때문입니다.

그래서 여기서는 내가 좋아하는 컴파일러를 설정하고 원하는 경우 테스트를 시도 할 수있는 온라인 IDE를 제공합니다. 난 당신이 더 나은하지만 난 당신의 오류를 재현 할 수 있습니다 도움이되지 수에 대한

https://godbolt.org/

죄송합니다.