decltype 与自动

新手上路,请多包涵

据我了解, decltypeauto 都将尝试找出某物的类型。

如果我们定义:

 int foo () {
    return 34;
}

那么这两个声明都是合法的:

 auto x = foo();
cout << x << endl;

decltype(foo()) y = 13;
cout << y << endl;

您能否告诉我 decltypeauto 之间的主要区别是什么?

原文由 James Leonard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 439
1 个回答

decltype 给出传递给它的表达式的 声明 类型。 auto 和模板类型推导一样。因此,例如,如果您有一个返回引用的函数,那么 auto 仍然是一个值(您需要 auto& 来获取引用),但是 decltype 将完全是返回值的类型。

 #include <iostream>
int global{};
int& foo()
{
   return global;
}

int main()
{
    decltype(foo()) a = foo(); //a is an `int&`
    auto b = foo(); //b is an `int`
    b = 2;

    std::cout << "a: " << a << '\n'; //prints "a: 0"
    std::cout << "b: " << b << '\n'; //prints "b: 2"

    std::cout << "---\n";
    decltype(foo()) c = foo(); //c is an `int&`
    c = 10;

    std::cout << "a: " << a << '\n'; //prints "a: 10"
    std::cout << "b: " << b << '\n'; //prints "b: 2"
    std::cout << "c: " << c << '\n'; //prints "c: 10"
 }

另请参阅 David Rodríguez 关于仅 autodecltype 之一可能的地方的回答。

原文由 Mankarse 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题