decltype和auto之间的等价

问题描述:

由于auto和decltype都用于推断类型。我以为 他们会一样。decltype和auto之间的等价

但是,this问题的答案是否定的。

我仍然认为它们不能完全不同。 我能想到一个简单的例子,其中i的类型在以下两种情况下都是相同的。

auto i = 10; and decltype(10) i = 10; 

那么auto和decltype行为等价的可能情况是什么?

+4

你在第二定义重复10。这不足以区别吗?这是给我的。 'auto'在日常生活中比'decltype'更有用,它主要用作元编程工具。 – 2012-07-12 20:18:57

+1

现在,我只关心推断的类型。 – 2012-07-12 20:21:11

+1

它们并不完全不同。你现在喜欢的其他答案呢? – 2012-07-12 20:21:28

auto行为完全相同一样的模板参数推导,这意味着如果不指定对它的引用,你没有得到一个。 decltype是表达的只是类型,因此需要引用到:

#include <type_traits> 

int& get_i(){ static int i = 5; return i; } 

int main(){ 
    auto i1 = get_i(); // copy 
    decltype(get_i()) i2 = get_i(); // reference 
    static_assert(std::is_same<decltype(i1), int>::value, "wut"); 
    static_assert(std::is_same<decltype(i2), int&>::value, "huh"); 
} 

Live example on Ideone.

+1

auto也可以与decltype一起使用。 http://msdn.microsoft.com/en-us/library/dd537655.aspx – 2012-07-12 20:22:31

+1

@ 0A0D:这只是后期指定的返回类型。 – Xeo 2012-07-12 20:24:04

+7

更具体地说,'decltype'将其表达式的值类别转换为引用限定:左值被限定为左值引用,而xvalue被限定为右值引用。 get_i()的类型不是“int&',”它是“int类型的左值。表达式从来没有引用类型。 – 2012-07-12 20:24:43