참고 : 아래 내용에도 불구하고 constexpr을 기본값으로 만드는 것에 대해 좋아합니다. 하지만 아직 완성되지 않은 이유를 묻는 질문에 대답하기 위해 mattnewport의 마지막 코멘트에 대해 간단하게 설명하겠습니다 :
오늘 상황을 고려하십시오. 상수 표현식이 필요한 컨텍스트에서 표준 라이브러리의 일부 함수를 사용하려고합니다. constexpr로 표시되지 않으므로 컴파일러 오류가 발생합니다. 이 작업을 위해 변경해야 할 것은 "명확하게"유일한 정의는 constexpr이라는 단어를 정의에 추가하는 것입니다.
이제 우리가 제안을 채택한 대체 우주에서의 삶을 고려해보십시오. 이제 코드가 컴파일됩니다.내년에는 작업중인 프로젝트에 Windows 지원을 추가하기로 결정했습니다. 얼마나 힘들 수 있습니까? Windows 사용자는 Visual Studio를 사용하여 컴파일하고 다른 모든 사용자는 gcc를 계속 사용하게됩니까?
처음으로 Windows에서 컴파일하려고하면 컴파일러 오류가 발생합니다.이 함수는 상수 표현 컨텍스트에서 사용할 수 없습니다. 문제의 코드를보고 gcc와 함께 제공되는 버전과 비교하십시오. 그것들은 약간 다르며 gcc와 함께 제공되는 버전은 단순한 사고로 인해 constexpr에 대한 기술적 요구 사항을 충족하며 Visual Studio와 함께 제공되는 것과 마찬가지로 다시 깎인 사고로 이러한 요구 사항을 충족시키지 못합니다. 이제 뭐?
아무 문제는 없지만 Microsoft에 버그 보고서를 제출할 것입니다.이 기능은 수정되어야합니다. 여러분의 버그 리포트를 닫습니다 : 표준은 결코이 함수가 상수 표현에서 사용 가능해야한다는 것을 절대로 말하지 않으므로 우리가 원하는대로 구현할 수 있습니다. 그래서 gcc 관리자에게 버그 보고서를 제출합니다. 왜 내가 이식성이없는 코드를 사용하고 있다고 경고하지 않았습니까? 그리고 그들은 그것도 닫습니다 : 그것이 휴대용이 아니라는 것을 어떻게 알았습니까? 다른 사람들이 표준 라이브러리를 어떻게 구현하는지 추적 할 수는 없습니다.
이제 어떻게 되나요? 아무도 정말 잘못한 일은 없었습니다. gcc 여러분이나 Visual Studio 사용자가 아니라 여러분이 아닙니다. 그러나 여전히 이식성이 떨어지는 코드로 끝나며이 시점에서 행복한 캠프가 아닙니다. 다른 모든 것이 평등하다면, 좋은 언어 표준은이 상황을 가능한 한 불가능하게 만들려고 노력할 것입니다.
다른 컴파일러 예제를 사용했지만 동일한 컴파일러의 최신 버전으로 업그레이드하거나 다른 설정으로 컴파일하려고 할 때도 마찬가지입니다. 예 : 함수에 유효한 인수를 사용하여 호출되는지 확인하는 assert 문이 포함되어 있습니다. 어설 션을 사용하지 않고 컴파일하면 어설 션이 "사라지고"함수가 constexpr에 대한 규칙을 충족합니다. 어설 션을 활성화하면 해당 어설 션이 충족되지 않습니다. (constexpr에 대한 규칙이 매우 관대하지만 C++ 11 규칙에 따라 더 큰 문제였던 요즘은 요즘에도 그럴 가능성이 적지 만 원칙적으로 요점은 여전히 남아 있습니다.)
마지막으로 우리는 분명히 알 수 있습니다 사소한 문제의 오류 메시지. 오늘날의 세계에서 constexpr 함수의 cout
문을 사용하려고하면 바로 간단한 오류가 발생합니다. 여러분의 세계에서 우리는 템플리트를 사용하는 것과 동일한 상황을 경험하게 될 것입니다. 깊은 스택 추적은 출력 스트림 구현의 맨 아래까지 계속됩니다. 치명적이지는 않지만 반드시 성가시다.
1 년 6 개월이 지났지 만 여전히 도움이되기를 바랍니다.
함수, 변수 또는 둘 다를 의미합니까? – aschepler
기록을 위해, 나는 가까운 투표에 동의하지 않습니다. 문제는 이것이 수행 될 수없는 기술적 인 이유를 묻는 것입니다. 기존의 대답은 어떤 의견도없이 그러한 답을줍니다. –