Argument Dependent Lookup未按预期工作

时间:2014-08-16 07:38:23

标签: c++ templates argument-dependent-lookup

我刚尝试在Visual C ++ 2013中测试Argument Dependent Lookup:

#include <utility>
#include <string>

struct X {};

int main (int argc, char* argv [])
{
    std::string s1;
    std::string s2 = move (s1); // succeed

    X a;
    X b = move (a); // Failed?!

    return 0;
}

我直接包含了utility标题,但它没有按预期工作!

参数依赖查找是否始终保证可以正常工作?

1 个答案:

答案 0 :(得分:3)

它按预期工作:

  • 在第一种情况下,ADL有效,因为在move中查找std::,因为参数为std::string

  • 在第二种情况下,X位于全局命名空间中,那里没有匹配的move函数,因此ADL什么也找不到。

如果在X内宣布std::(它不应该是未定义的行为......),则ADL按预期工作:

namespace std { struct X {}; } 

int main (int argc, char* argv [])
{
    std::string s1;
    std::string s2 = move (s1); // succeed

    std::X a;
    std::X b = move (a); // succeed

    return 0;
}