该计划是否违反ODR?

考虑这个程序:

#include <type_traits>

template <typename T> constexpr bool g() { return true; }
template <typename T> std::enable_if_t< g<T>()> f() {}
template <typename T> std::enable_if_t<!g<T>()> f() {}

int main() { f<int>(); }

(编译器资源管理器)

各种版本的GCC和Clang都可以接受,但是MSVC不能接受,编译失败报错

1>D:x.cpp(5,49): error C2995: 'enable_if<0,void>::type f(void)': function template has already been defined
1>D:x.cpp(4): message : see declaration of 'f'
1>D:x.cpp(4,49): error C3861: 'f': identifier not found

第一条错误消息向我暗示了 ODR 违规 - 但如果该程序是格式错误的 NDR,我需要帮助理解为什么会这样。我已经检查了标准草案中的[temp.over.link],但我不确定我是否正确解释了它。据我了解,该程序是可以的,因为这些函数模板具有不同的签名。

在不太可能的情况下,这个程序是正确的,为什么 MSVC 拒绝它?

以上是该计划是否违反ODR?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>