9

我试图理解为什么not_a_ref不是参考。我知道我可以将其作为参考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

3 回答 3

5

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

为变量 d 推导的类型然后是使用从函数调用 (14.8.2.1) 的模板参数推导规则确定的推导 A。

从 14.8.2.1(从函数调用中推导出模板参数)第 3 段:

如果 P 是引用类型,则使用 P 所引用的类型进行类型推导。

所以对于 的类型推导,引用只是被忽略了auto

请注意此规则与 的规则有何不同decltype

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

于 2012-07-01T09:55:17.863 回答
3

看看模板参数推导。auto x = stuff;就. template<typename T> void f(T x) {} f(stuff);_x

于 2012-07-01T04:47:25.103 回答
-1

根据 C++11 标准,auto 算作简单类型说明符 [7.1.6.2],因此与其他简单类型说明符相同的规则适用于它。这意味着用 auto 声明引用与其他任何东西没有什么不同。

这意味着下一行:

auto not_a_ref = get_stuff();

将与以下内容相同:

std::vector<int> not_a_ref = get_stuff();
于 2012-07-01T08:11:49.057 回答