Visual C++ 中的参数相关查找

问题描述 投票:0回答:1

我的程序在 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++ templates visual-c++ c++17 c++20
1个回答
0
投票

它与 C++17 与 C++20 无关。

模板中的 MSVC 默认名称查找行为不符合标准。您需要给出

/permissive-
标志才能使其符合标准。

/std:c++20
标志(或任何从未 C++ 版本的
/std:c++*
标志)也会隐式设置
/permissive-
,而
/std::c++17
和早期版本的标志则不会。

在标准 C++ 中,结果

1
始终是唯一正确的答案。

© www.soinside.com 2019 - 2024. All rights reserved.