令我惊讶的是,以下代码可以编译并运行(vc2012 和 gcc4.7.2)
class Foo {
struct Bar { int i; };
public:
Bar Baz() { return Bar(); }
};
int main() {
Foo f;
// Foo::Bar b = f.Baz(); // error
auto b = f.Baz(); // ok
std::cout << b.i;
}
这段代码编译正常是否正确?为什么它是正确的?为什么我可以在私有(private)类型上使用 auto
,而我不能使用它的名称(如预期的那样)?
最佳答案
auto
的规则在很大程度上与模板类型推导相同。发布的示例的工作原理与您可以将私有(private)类型的对象传递给模板函数的原因相同:
template <typename T>
void fun(T t) {}
int main() {
Foo f;
fun(f.Baz()); // ok
}
你问为什么我们可以将私有(private)类型的对象传递给模板函数?因为只有类型的名称是不可访问的。该类型本身仍然可用,这就是您完全可以将其返回给客户端代码的原因。
关于c++ - 为什么我可以在私有(private)类型上使用 auto?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48595214/