에서 놀고 auto
있었습니다 std::pair
. 아래 코드에서 함수 f
는 std::pair
템플릿 매개 변수에 따라 유형 중 하나를 반환해야합니다 .
실제 예 :
실시 예 1
template <unsigned S>
auto f()
{
if constexpr (S == 1)
return std::pair{1, 2}; // pair of ints
else if constexpr (S == 2)
return std::pair{1.0, 2.0}; // pair of doubles
else
return std::pair{0.0f, 0.0f}; // pair of floats
}
이것은 gcc 9.2, gcc 10.0, clang 9.0 및 clang 10.0에서 작동합니다.
다음으로, std::pair
명확한 이유로 반환 유형을 명시 적으로 작성하고 싶었습니다 .
실시 예 2
template <unsigned S>
std::pair<auto, auto> f()
{
if constexpr (S == 1)
return {1, 2};
/* ... */
}
gcc 9.2 / 10.0과 clang 9.0 / 10.0 모두 컴파일에 실패했습니다.
gcc 9.2
error: invalid use of 'auto'
error: template argument 1 is invalid // first argument (auto) of std::pair
error: template argument 2 is invalid // second argument (auto) of std::pair
error: cannot convert '<brace-enclosed initializer list>' to 'int' in return
마지막 오류 메시지에서 GCC 9.2은 믿는 것 같다 std::pair<auto, auto>
입니다 int
. 이것을 어떻게 설명 할 수 있습니까?
gcc 10.0
error: returning initializer list
이 오류는 이해할 만하지 만 생성자 std::pair
가 호출 될 것으로 기대 했거나 여기에 누락 된 것이 있습니까?
클랑 9.0 및 10.0
'auto' not allowed in template argument
excess elements in scalar initializer
no matching function for call to 'f'
좋아, clang은 이것을 좋아하지 않습니다. 두 번째 오류 메시지에서 clang은 반환 유형이이라고 생각합니다 int
.
마지막으로 gcc 10.0으로 컴파일하여 얻은 오류를 수정하기 위해 std::pair
명시 적으로 반환하기로 결정했습니다 .
실시 예 3
template <unsigned S>
std::pair<auto, auto> f()
{
if constexpr (S == 1)
return std::pair{1, 2};
/* ... */
}
클랑 9.0 및 10.0
이전과 동일하지만 추가로
no viable conversion from returned value of type 'std::pair<int, int>' to function return type 'int'
여기 clang은 여전히 우리가 int
?
gcc 9.2
이전과 동일합니다.
gcc 10.0
효과가있다!
일부 기능은 여전히 구현해야하거나 위에서 설명한 상황 중 하나에서 옳고 다른 컴파일러가 있습니까? 제 생각에는 예제 2가 작동해야합니다. 아니면 안 돼요?