【发布时间】:2021-12-26 04:16:21
【问题描述】:
template <typename T>
int get_num(const T&)
{
return 42;
}
struct Foo
{
int i = get_num(*this);
};
int get_num(const Foo&)
{
return 23;
}
int main()
{
std::cout << Foo().i << std::endl; // MinGW64 - 42, MSVC - 23
return 0;
}
MSVC 选择非模板get_num“重载”。即使模板只是前向声明,它也会成功链接。
MinGW64 将选择默认的模板实现。如果模板没有定义,将无法链接。
谁对谁错?标准是怎么说的?
但是这个版本对两个编译器产生了相同的结果...为什么它不去无限递归?
template <typename T>
int get_num(const T& t)
{
std::cout << "Template version called" << std::endl;
return get_num(t);
}
struct Foo
{
int i = get_num(*this);
};
int get_num(const Foo&)
{
std::cout << "Non-Template version called" << std::endl;
return 23;
}
MSVC 输出:
Non-Template version called
23
MinGW64 输出:
Template version called
Non-Template version called
23
我认为在使用 MSVC 时会涉及到 ADL。
【问题讨论】:
-
您是否在以迂腐、符合标准的模式使用 MSVC 进行编译?
-
@NicolBolas 是的
-
还有,它是什么版本?
-
@NicolBolas MSVC 19.29.30133.0
标签: c++ visual-c++ c++14 language-lawyer mingw