为什么在常量引用的auto关键字中忽略const

时间:2017-09-07 08:47:52

标签: c++ auto

int main()
{

    int a = 10;
    const int &b = a;
    int &c = b; //gives error : C should a  reference to a const b 
    auto d = b; // why const is ignored here?
    d = 15;
    cout << a << d;
}

在c ++ Primer中,它提到&#34; const in reference type始终是低级&#34;那么auto d = b怎么不恒定?

3 个答案:

答案 0 :(得分:4)

因为auto的类型推导规则推导为对象类型。您正在复制int引用的新b的初始化。

这是设计的。我们希望创建新的对象,而无需明确指定其类型。而且通常情况下,它是一个新对象,是一个其他对象的副本。如果它被推断为参考,它将失去预期的目的。

如果您希望在初始值设定项为引用时将推断类型作为引用,那么可以使用decltype(auto)的占位符来完成:

decltype(auto) d = b; // d and b now refer to the same object
d = 15; // And this will error because the cv-qualifiers are the same as b's

答案 1 :(得分:1)

对于auto d = b,您声明d为非参考。这意味着d将是从b复制的新对象,然后b的引用部分将被忽略,之后,const-ness也会被忽略。因此d的类型为int

您可以明确声明d作为参考,然后忽略b的常量。 e.g。

auto& d = b; // the type of d is const int &

答案 2 :(得分:0)

因为扣除的类型是int,而不是int&

这意味着d不是参考。