我的程序在 Visual Studio 的 C++20 模式下的行为符合我的预期,但我需要使其在 C++17 模式下运行,在该模式下程序会更改其输出。
最小化后如下:
template <typename T>
int f() { return g(T{}); }
namespace {
struct A{
friend int g(const A &) { return 1; }
};
}
template <typename T>
int g(T&&) { return 2; }
int main() { return f<A>(); }
在 C++20 模式下,
main()
的输出为 1
,而在 C++17 模式下,输出为 2
。在线演示:https://gcc.godbolt.org/z/h8b8qoGGj
我想知道 C++20 的哪些新功能(C++17 中不存在)导致了结果的差异。
它与 C++17 与 C++20 无关。
模板中的 MSVC 默认名称查找行为不符合标准。您需要给出
/permissive-
标志才能使其符合标准。
/std:c++20
标志(或任何从未 C++ 版本的 /std:c++*
标志)也会隐式设置 /permissive-
,而 /std::c++17
和早期版本的标志则不会。
在标准 C++ 中,结果
1
始终是唯一正确的答案。