Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当auto的初始值设定项是引用时,为什么auto不是引用?_C++_C++11_Standards - Fatal编程技术网

C++ 当auto的初始值设定项是引用时,为什么auto不是引用?

C++ 当auto的初始值设定项是引用时,为什么auto不是引用?,c++,c++11,standards,C++,C++11,Standards,我试图理解为什么not\u a\u ref不是参考。我知道我可以通过auto&将其作为参考。我在标准中翻找了一会儿,但还是迷路了,弄不清楚这种行为是如何定义的 例如: #include <vector> #include <iostream> #include <type_traits> std::vector<int> stuff; std::vector<int>& get_stuff() { return st

我试图理解为什么
not\u a\u 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;
}
#包括
#包括
#包括
std::载体材料;
std::vector&get_stuff()
{
归还物品;
}
int main()
{
auto not_a_ref=get_stuff();
if(std::is_reference::value)

std::cout看一下模板参数推导。
auto x=stuff;
相当于
template void f(tx){}f(stuff);
根据C++11标准,就
x的类型而言,auto算是一个简单的类型说明符[7.1.6.2],因此,对它的应用规则与对其他简单类型说明符的应用规则相同。这意味着使用auto声明引用与其他任何东西都没有区别

这意味着下一行:

auto not_a_ref = get_stuff();
将与以下内容相同:

std::vector<int> not_a_ref = get_stuff();
std::vector not_a_ref=get_stuff();
来自C++11草案7.1.6.4(
auto
说明符)第6段:

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

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

如果p是引用类型,则p引用的类型用于类型推断

因此,对于
auto
的类型推断,该引用被忽略

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


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

如果它按照您认为的方式工作,那将非常恼人。这将使
自动
远没有那么有用,因为添加引用很容易,但删除引用是一件痛苦的事。我决不是建议它应该是任何其他方式n它是-只是试图理解这个行为是如何在标准中指定的。这是我个人目标的一部分,通过阅读标准就能够解决这类问题-但我被卡住了。我不想查看标准,所以我只是在谷歌上搜索。第一页有一个函数返回对float,类型被推断为float。请阅读。特别是标题为
引用类型、CV限定符和存储说明符的部分,它给出了一个很好的理由,说明了在需要引用时为什么需要显式。C++11标准字面上指代了模板参数推断(如DeadMG下面的回答),详见第7.1.6.4/6节。模板参数推断规则见第14.8.2.1节,但规则列表有点长。现在,我必须纠正自己…在14.8.2.1中,
P
是模板参数类型的类型(即
auto
)而
A
是用于推导的表达式类型。但是,表达式类型永远不是引用,因此主要事实仍然是
auto x
变量永远不会是引用。