2017-12-14 15 views
1

내가 다음 개체가 말하는 constexpr constexpr되지 않습니다언제 실제로

#include <string> 

class Foo 
{ 
public: 
    constexpr Foo() {}; 
    constexpr std::string foo() const { return "foo"; } 
}; 

이 분명히 잘못, std::stringconstexpr에서 반환 할 수없는, 문자 그대로없는, 그리고 컴파일러는 그 효과에 불만 .

그러나 그 개체를 템플릿으로 만들고 Foo<1>과 같은 임의의 것으로 인스턴스화 한 다음 함수를 호출하면 컴파일러는 경고로 내게 너무 많은 것을주지 않습니다.

#include <string> 

template <int N> 
class Foo 
{ 
public: 
    constexpr Foo() {}; 
    constexpr std::string foo() const { return "foo"; } 
}; 

이 상황에서 템플릿 개체는 특별 무엇입니까? (GCC 4.9)

+4

당신이 어떤 지점에서 템플릿을 초기화합니까? 참고로, GCC 4.9는 정말 오래되었습니다. 업그레이드를 고려하고 싶을 것입니다. – tambre

+0

@ 확실하지 않지만,'T'에 대해 유효하지 않은 afaik 템플릿은 컴파일러 오류를 일으키기 위해 인스턴스화 할 필요가 없습니다. – user463035818

+0

Clang은 그런 식으로 불평합니다. – chris

답변

1

코멘트마다, this is ill-formed, and no diagnostic is required. 사양은 작가에게 경고 진단을 필요로하지 않기 때문에

, 컴파일러는 당신이 코드를 작성하는 경우 아무것도 할이 없으며 컴파일러는 사용자가 자신의 코드를 할 수 있어야한다고 생각한다는 사실을 무시 무료입니다 컴파일 시간에 평가되고 메리 방식으로 수행됩니다.

이제 나와 같은 사람이라면 아마 "잠깐 ... 왜?"라고 생각할 것입니다.이 편지는 내가 쓴 것이 정확히 예상 한 결과가되지 않을 것이므로 적어도 경고의 완벽한 경우 인 것 같습니다. . "

  • gcc compiles fine
  • :

    은, 분명히, 그 소리의 개발자는이 코드가 깔끔하게 율법의 문자에 따라 컴파일을 통해 갈 수 있도록에도 불구하고, 너무 생각 것입니다, 그 소리는 완전한 오류가 발생합니다
  • clang does not
+1

코드는 법령에 따라 컴파일 과정을 거칠 필요가 없습니다. 던지는 오류는이 경우 완벽하게 호환되는 동작입니다. – rubenvb

+0

변경해야 함 – MrBZapp