汽车有什么用? - ADL?

时间:2017-02-27 00:40:26

标签: c++ c++11

我一直认为auto应该使用以下格式auto varName = someOtherVar;。今天我发现我也可以使用auto varName(someOtherVar);。起初我认为这可能是工作中的Argument Different Lookup。但我不确定。使用这种自动语法有哪些限制?以下是一些代码:

#include <iostream>
#include <string>
#include <vector>

class Person {
    public:
    Person(std::string s) : name(s) {}
    Person(const Person& p) : name(p.name) {}
    std::string name;
};

int main()
{
    Person p("hello");
    auto p2(p); // equivalent to auto p2 = p; ?
    std::cout << p2.name;
}

1 个答案:

答案 0 :(得分:2)

可以使用

auto代替具有初始化程序的声明中的类型说明符;然后从初始化器推导出类型。

T a = b;被称为copy initializationT a(b);被称为direct initialization,存在细微差别。

因此auto p2(p);Person p2(p);相同。由于初始化程序与初始化对象的类型相同,因此在这种情况下,复制初始化和直接初始化是相同的。

“依赖于参数的查找”是指解析函数名称的范围。但这是一个对象声明,而不是函数调用。 (std::cout << p2.name;行上有ADL,但operator<<通过ADL解析为std::operator<<)。