在 C 11 中,auto 关键字提供了一种便捷的方法来根据变量的初始值设定项自动推断变量的类型。但是,关于 auto 是否会解析为值或引用,需要考虑某些因素。
规则很简单:它取决于变量的声明方式。
<code class="cpp">int i = 5; auto a1 = i; // value auto &a2 = i; // reference</code>
在第一种情况下,a1 是一个值,因为它没有声明为引用。在第二种情况下,a2 是一个引用,因为它被显式声明为 1。
让我们将此规则应用于您提供的示例:
以下代码使用模板元编程演示了此行为:
<code class="cpp">#include <typeinfo> #include <iostream> template< typename T > struct A { static void foo(){ std::cout << "value" << std::endl; } }; template< typename T > struct A< T&> { static void foo(){ std::cout << "reference" << std::endl; } }; float& bar() { static float t=5.5; return t; } int main() { int i = 5; int &r = i; auto a1 = i; auto a2 = r; auto a3 = bar(); A<decltype(i)>::foo(); // value A<decltype(r)>::foo(); // reference A<decltype(a1)>::foo(); // value A<decltype(a2)>::foo(); // value A<decltype(bar())>::foo(); // reference A<decltype(a3)>::foo(); // value }</code>
输出:
value reference value value reference value
这确认了 auto 的类型是由它的声明决定的,而不是由它的初始化器的类型决定的。
以上是C 11 中的“auto”何时推导出值或引用?的详细内容。更多信息请关注PHP中文网其他相关文章!