首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >decltype vs auto

decltype vs auto
EN

Stack Overflow用户
提问于 2012-08-23 10:41:25
回答 5查看 18.4K关注 0票数 63

据我所知,decltypeauto都会尝试找出某种东西的类型。

如果我们定义:

代码语言:javascript
复制
int foo () {
    return 34;
}

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

代码语言:javascript
复制
auto x = foo();
cout << x << endl;

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

你能告诉我decltypeauto的主要区别是什么吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-23 10:53:25

decltype给出了传递给它的表达式的声明类型。auto与模板类型演绎做同样的事情。因此,例如,如果您有一个返回引用的函数,auto仍然是一个值(您需要auto&来获取一个引用),但是decltype将是返回值的类型。

代码语言:javascript
复制
#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中只有一个可能的地方的答案。

票数 60
EN

Stack Overflow用户

发布于 2012-08-23 10:55:18

auto (在它推断类型的上下文中)仅限于定义具有初始化器的变量的类型。decltype是一种更广泛的构造,它以额外信息为代价,将推断表达式的类型。

在可以使用auto的情况下,它比decltype更简洁,因为您不需要提供从中推断类型的表达式。

代码语言:javascript
复制
auto x = foo();                           // more concise than `decltype(foo()) x`
std::vector<decltype(foo())> v{ foo() };  // cannot use `auto`

在使用函数的尾随返回类型时,关键字auto也用于完全不相关的上下文中:

代码语言:javascript
复制
auto foo() -> int;

auto只有一个前导,以便编译器知道这是一个带有尾随返回类型的声明。虽然上面的示例可以简单地转换为旧样式,但在泛型编程中它是有用的:

代码语言:javascript
复制
template <typename T, typename U>
auto sum( T t, U u ) -> decltype(t+u)

请注意,在这种情况下,auto不能用于定义返回类型。

票数 43
EN

Stack Overflow用户

发布于 2020-01-30 11:21:16

修改@Mankarse的示例代码,我认为更好的代码搞砸了:

代码语言:javascript
复制
#include <iostream>
int global = 0;
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 << "global: " << global << '\n'; //prints "global: 0"

    std::cout << "---\n";

    //a is an `int&`
    a = 10;

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

    return 0;

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12084040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档