我刚尝试在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
标题,但它没有按预期工作!
参数依赖查找是否始终保证可以正常工作?
答案 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;
}