2017-01-23 86 views
0

我想检查一个完全合格的名称和一个非限定名称或部分限定名称是否引用相同的符号,即使没有定义一个名称。也就是说,我希望能够写这样的事情作为重构工具的一部分:如何检查一个名称是否与另一个名称相同?

namespace A { 
void f() {}; 
} 

namespace B { 
namespace A {}; 

    bool g() { 
    // returns false 
    return is_same_symbol<A::f, ::A::f>::value; 
    } 
} 

namespace C { 
    bool h() { 
    // returns true 
    return is_same_symbol<A::f, ::A::f>::value; 
    } 
} 
+1

“我想检查是否能够检查两个不同的符号是否指向同一事物,即使其中一个不存在。”这没有什么意义。 –

+0

@NeilButterworth是的,我知道,我不知道如何表达它。我想有一种更好的方式来说这是“我想检查一个完全合格的名称和一个不合格或部分合格的名称是否指向相同的符号” –

+2

如果一个符号没有定义,并且您尝试使用它,你会得到一个编译器错误,很简单。 – AndyG

回答

0

你澄清评论:

我试图找出正确的SFINAE咒语用于检查给定名称的自由功能是否存在。

你不行。

当你说一个名为foo免费函数存在,你是什么意思?

它必须是以下之一:

编译器已经看到的foo声明:

... int foo(int i); 

或:

编译器已经看到的foo一个定义:

... int foo(int i) { 
    ... 
    return ...; 
} 

定义也是一个声明,所以如果编译器没有看到foo的声明 那么它还没有看到一个定义。

假设您正在尝试SFINAE-probe是否声明了foo。 如果编译器甚至没有见过的foo的声明则你写的任何 后续代码使用foo的名字会招来 在静脉编译错误:

error: use of undeclared identifier 'foo' 

你可以不写代码到SFINAE-probe是否声明foo是因为 您不能编写使用未声明名称的C++句号。

假设您正在尝试SFINAE-探针foo是否为定义为。 要做到这一点,首先必须有foo的的声明 - 要么是 ,要么是你自己写的,或者是你从某个头文件中获得的。

当然不过,鉴于foo声明,编译器无法分辨是否 与否它被定义并不在乎,除非在特殊情况下,该功能 被声明为staticinline或匿名命名空间。否则,它将发现或未找到对链接器的定义。

通常,然后,SFINAE-探测功能定义的存在同样是 非起动器。即使foo声明staticinline或在一个匿名的命名空间,且缺乏编译单元内的定义,即在其声明符合使用foo任何 代码保持合式 代码;所以即使在那些情况下,SFINAE-探测它的定义仍然没有意义。

相关问题