gpt4 book ai didi

C++ 使用声明和参数依赖查找

转载 作者:太空狗 更新时间:2023-10-29 23:00:43 26 4
gpt4 key购买 nike

下面的代码是有效的 C++98 还是需要更新版本的 C++ 标准?

namespace basic
{
void f(int) {}
}

namespace lib
{
template<class T1, class T2>
void g(T1 x1, T2 x2)
{
using basic::f; // pull in function f for basic types without ADL
f(x1);
f(x2); // error: no suitable conversion function from "user::c" to "int" exists
}
}

namespace user
{
class c {};

void f(c) {}
}

int main()
{
lib::g(1, user::c());
}

显然,我的编译器(我猜是基于 EDG 前端)在 basic::f 的 using 声明之后不考虑 user::f。根据 C++98,这是正确的行为吗?

最佳答案

我认为这不是您的编译器的正确行为。您的模板应该只在声明使用点之后才实际解析/实例化。因此,此时它应该解析该实例化的名称,并且这些名称包括 ADL 拉入查找,所以这应该有效。

我认为 MSVC 仍然有待处理的事情来执行此两阶段查找,并且您的编译器(EDG 前端?编译器的名称是什么)也可能会执行此操作。我确实知道 MSVC2015 没有进行适当的两阶段查找,但我不确定这是否适用于此示例,您的暗示是您没有使用该编译器。

关于C++ 使用声明和参数依赖查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33015435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com