首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中使用auto说明符推断Prvalue类型时的判别

在C++中使用auto说明符推断Prvalue类型时的判别
EN

Stack Overflow用户
提问于 2021-09-30 08:04:40
回答 1查看 86关注 0票数 3

我试图理解为什么C++标准/编译器会歧视auto的行为。我举的例子如下:

代码语言:javascript
复制
int main()
{
    
    const int i = 34;//top level const on rhs. i is const int
    const auto &p = i;// low level const on rhs. p is const int&
    
    
    auto &g = i;//g is const int& . In this case the compiler is able to deduce that only reference to const can be bound to a const int 
    
    //auto &k = 5;//but in this case the compiler is not able(allowed) to deduce that only a reference to const can be bound to a prvalue 
    
    return 0;
}

如上面的代码示例所示,编译器能够/允许推导出变量g的类型,因为只有对const类型的引用可以绑定到const类型,而在下一种情况下,即使只有对const类型的引用可以绑定到const类型,编译器也不能推导出变量k的类型。当然,rvalue引用也可以绑定到prvalue或xvalue。

我的问题是,即使我们有对一些auto推导类型的左值引用,为什么C++标准不允许编译器将k推导为const int&,就像在变量g的情况下一样?对我来说,这似乎足够直观了。也许有一些与此相关的问题,你们中的任何一个都可以告诉我。

我知道初始化器的顶级常量被忽略了。例如,

代码语言:javascript
复制
const int i = 5;
auto k = i; //k is deduced to be int because the top level const of the initializer i is ignored

我的问题是关于rhs中低级const的隐含加法/扣除法。

EN

回答 1

Stack Overflow用户

发布于 2021-09-30 09:15:27

原因是

代码语言:javascript
复制
auto &k = 5;

是不可编译的,这与下列不可编译的原因相同

代码语言:javascript
复制
template<typename T>
void f(T&) {}

int main() {
    f(5);
}

那么,如果问题是为什么不能将auto推导为const int__?在第一个片段中,这个问题转换为为什么不能将T演绎为const int__?在第二个代码片段中。

好的,规则»说,你传递给f的表达式的类型,在本例中是int,因为5int (这里没有const ),是根据参数的类型T&来确定T的。因此,唯一的可能性是Tint,因此参数的类型为int&

但是不能向int&参数传递诸如5之类的右值,这与类型推导无关。实际上,Clang在上面给出的f(5)错误是

T = int

候选函数不可行:第一个参数需要左值

所以没有像“我可以添加一个const来使它有效吗?”这样的聪明的事情。还在继续。

将上面的内容与这里推导出const的原因进行比较:

代码语言:javascript
复制
const int i = 34;
auto &g = i;

同样,您可以使用上面定义的f将第二个语句映射到f(i)。在本例中,表达式(i)的类型为const int (而不是int作为5),因此当T&与其进行模式匹配时,T将被推导为const int

²我指的是Scott Meyer的Effective现代C++中的项目1。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69388477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档