gpt4 book ai didi

c++ - 模板实例化期间第二遍名称查找的静态与匿名命名空间的差异

转载 作者:行者123 更新时间:2023-12-04 07:22:29 26 4
gpt4 key购买 nike

我早就停止使用 static支持匿名命名空间的辅助函数,它具有处理类型、变量和模板以及函数的优点。
然而,当我用包装模板替换对它的调用时没有找到一个函数,我感到很惊讶。查看代码 https://godbolt.org/z/GrojceqGx使用与我的项目匹配的编译器和选项。

#include <utility>
//#define WORKING

class C {};

template <typename Left, typename Right>
auto wrapper (Left&& left, Right&& right, const char* name)
{
return foo (std::forward<Left>(left),std::forward<Right>(right));
}

#ifdef WORKING
static
void foo (C& left, int right)
{
// compiles when using static function
}
#else
namespace {
void foo (C& left, int right)
{
// fails to compile in anonymous namespace
}
}
#endif

void sample()
{
C x;
wrapper (x, 17, "call 1");
}
为什么 wrapper的实例化见 foo当它是 static但不是在匿名命名空间中时?实例化点在此翻译单元中,无论哪种方式都在同一位置。

最佳答案

因为不管你信不信,匿名命名空间完全是另一个命名空间。而不是全局命名空间。fooADL 找到当您使用 static .因为现在foo正确地位于 C 的关联命名空间中(全局命名空间)。
然而,它适用于内联匿名命名空间,即

inline namespace { }
由于 ADL 旨在与内联命名空间配合使用。

关于c++ - 模板实例化期间第二遍名称查找的静态与匿名命名空间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68413332/

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