使用Decltype或编译器Bug进行转换时的参数依赖查找问题?

时间:2016-11-23 10:19:09

标签: c++ argument-dependent-lookup compiler-bug

在VC ++ 2010中使用Argument-Dependent Lookup时,我使用>>> func(1, 2, 3, 4, 5) 1 2 (3, 4, 5) 生成了参数并遇到了一些奇怪的结果:

decltype()

以上结果正常执行:

template<typename T>
struct Type {
    typedef T type;
};
namespace NSC {
    typedef enum {
        mon
    } DOW;
    void proc1(DOW s, int a) {
        printf("int proc1\n");
    }
    void proc1(DOW s, long long a) {
        printf("long long proc1\n");
    }

}
void p1(int a) {
    printf("int p1\n");
}
void p1(long long a) {
    printf("long long p1\n");
}

long long g;
int h;
int _tmain(int argc, _TCHAR* argv[])
{
    NSC::DOW s=(NSC::DOW)0;
    //proc1(s,(decltype(g))4.0);
    proc1(s,(Type<decltype(2LL)>::type)4.0);
    proc1(s,(Type<decltype(2)>::type)4.0);
    p1((decltype(2LL))4);
    p1((decltype(2))4);

    return 0;
}

请注意,long long proc1 int proc1 long long p1 int p1 用于表明类型转换与依赖于参数的查找有效,而proc1()则表示使用p1()的类型转换直接与正常的重载函数一起使用。但是当我取消评论该行时:

decltype()

(请注意,演员也是使用proc1(s,(decltype(g))4.0); 而不是通过decltype()模板直接完成的,并且涉及参数依赖查找。)查找失败:

Type

由于查找规则的某些复杂细节或仅仅是编译器错误导致失败吗?

0 个答案:

没有答案