命名空间范围的模板函数在另一个命名空间中可见
Namespace-scoped template function becomes visible in another namespace
我遇到了一个奇怪的命名空间范围行为(使用 g++ 4.8.2)。为了解释这个问题,我提取了一个重现这种奇怪行为的最小代码:
namespace Weird {
template <typename T>
struct Rec
{
T val;
Rec( T const& _val ) : val( _val ) {}
};
template <typename T>
Rec<T>
foo( Rec<T> const& r )
{
return Rec<T>( r.val * 2 );
}
};
Weird::Rec<double>
bar( Weird::Rec<double> const& _input )
{
return foo( _input );
}
在这个代码中,我希望 G++ 抱怨 "foo" 没有在 "bar" 范围内定义,但事实并非如此;代码编译得很好。
所以我有点困惑。g++ 是错误的(命名空间泄漏)吗?或者如果不是,根据哪种机制,"foo"在"酒吧"中变得可见?
这就是参数依赖查找(ADL),也称为Koenig查找。
简而言之,使用运算符或未经修饰的函数调用将在操作数或参数的封闭命名空间中找到名称。
相关文章:
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 使用另一个命名空间中的函数C++
- 使用命名空间在另一个".cpp"文件中定义
- 如何使用另一个项目命名空间?
- 使用匿名命名空间中的函数或另一个文件中的静态函数不应该出错吗?
- 在模板参数的函数中使用一个命名空间或另一个命名空间
- C++另一个命名空间中函数的 ADL
- 如何在另一个名称空间内从另一个命名空间内明确专业化功能模板
- 我可以在标头中将一个命名空间"import"到另一个命名空间中吗?
- 是否可以将一个命名空间类 #include 到另一个命名空间中
- 从另一个命名空间访问标准命名空间数据成员
- 另一个命名空间和 CRTP 中的模板友元函数
- 将 std::vector 重命名为另一个类以进行重载
- 依赖于参数的查找在来自另一个命名空间的别名类型上意外行为
- 从另一个命名空间中C++全局命名空间访问
- 如何在另一个命名空间中使用常量定义的外部
- 如何在vc++中将命名空间包含在另一个项目的另一个文件中
- 一个命名空间是否可以是另一个命名空间的成员
- 从另一个类引用命名空间
- 匿名命名空间和一个定义规则