【发布时间】:2021-09-25 12:20:01
【问题描述】:
我已经长期停止使用 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 的实例化在static 时会看到foo,但在匿名命名空间中时却看不到?实例化点在这个翻译单元中,无论哪种方式都在同一个位置。
【问题讨论】:
-
更新代码中的指令和注释以更清楚地显示差异,尽管这确实改变了问题中的代码与 Godbolt 上的代码。
-
如果您将模板声明移到
foo- live - godbolt.org/z/nbxf5nGsY 的声明之后,也可以使用