2012-07-01 35 views
9

我想了解为什么not_a_ref不是一个参考。我明白,我可以通过auto &将其作为参考。我在标准中挖了一段时间,但是迷了路,无法弄清楚这种行为的定义。为什么auto的初始值设定项是引用时不是引用?

例子:

#include <vector> 
#include <iostream> 
#include <type_traits> 

std::vector<int> stuff; 

std::vector<int>& get_stuff() 
{ 
    return stuff; 
} 

int main() 
{ 
    auto not_a_ref = get_stuff(); 

    if(std::is_reference<decltype(not_a_ref)>::value) 
     std::cout << "is_reference true" << std::endl; 
    else 
     std::cout << "is_reference false" << std::endl; 

    if(&not_a_ref != &stuff) 
     std::cout << "definately not a reference" << std::endl; 

    return 0; 
} 
+4

如果它按照您认为的那样工作,那将会很烦人。这会让'auto'变得不那么有用,因为添加一个引用很容易,但删除一个就很麻烦。 –

+0

我绝不会暗示它应该是任何其他方式,而只是试图了解标准中如何规定此行为。它是我个人目标的一部分,能够通过阅读标准来了解这类事情 - 但我陷入了困境。 – Zac

+0

[这里是论文。](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf)我不喜欢看标准,所以我只是使用Google搜索。第一页有一个函数的例子,返回一个对float的引用,并且类型被推断为float。 –

回答

5

从C++ 11草案,7.1.6.4(auto说明符)段6:

推导出变量d类型是,则推导出确定使用模板参数推导规则从一个功能卡(14.8.2.1)。

而且从14.8.2.1第3(从函数调用推导模板参数):

如果P是引用类型,被P所提到的类型用于类型扣除。

因此,仅对于auto的类型扣除忽略该参考。

注意这条规则是如何从的decltype不同。

UPDATE:请参阅下面的评论,因为我认为14.8.2.1段落3不适用。

+0

现在,我必须纠正自己......在14.8.2.1中,'P'是模板参数类型(即'auto')的类型,而'A'是用于演绎的表达式的类型。但是,表达式的类型永远不会是引用,所以主要的事实是'auto x'变量永远不会成为引用。 – rodrigo

3

看一看模板实参推演。 auto x = stuff;相当于template<typename T> void f(T x) {} f(stuff);,其类型为x

-1

根据该C++ 11标准,自动计数作为一个简单型说明符[7.1.6.2],因此,同样的规则适用于它作为其他简单型说明符。这意味着用auto声明引用与其他任何东西都没有什么不同。

这意味着下一行:

auto not_a_ref = get_stuff(); 

将是相同:

std::vector<int> not_a_ref = get_stuff(); 
相关问题