我对以下代码的编译和运行感到惊讶(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;
}
这段代码编译正确吗?为什么它是正确的?为什么我可以使用auto
在私有类型上,而我不能使用它的名称(如预期的那样)?
规则为auto
大多数情况下,与模板类型推导相同。发布的示例的工作原理与您可以将私有类型的对象传递给模板函数的原因相同:
template <typename T>
void fun(T t) {}
int main() {
Foo f;
fun(f.Baz()); // ok
}
您可能会问,为什么我们可以将私有类型的对象传递给模板函数?因为只有类型的名称是不可访问的。该类型本身仍然可用,这就是为什么您可以将其返回给客户端代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)