我一直认为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;
}
答案 0 :(得分:2)
auto
代替具有初始化程序的声明中的类型说明符;然后从初始化器推导出类型。
T a = b;
被称为copy initialization,T a(b);
被称为direct initialization,存在细微差别。
因此auto p2(p);
与Person p2(p);
相同。由于初始化程序与初始化对象的类型相同,因此在这种情况下,复制初始化和直接初始化是相同的。
“依赖于参数的查找”是指解析函数名称的范围。但这是一个对象声明,而不是函数调用。 (std::cout << p2.name;
行上有ADL,但operator<<
通过ADL解析为std::operator<<
)。