You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何*std::make_unique<SomeClass>()可绑定非const引用?VS2019编译疑问

关于std::make_unique解引用作为默认参数的编译问题
  • function2编译报错的原因很直接:SomeClass()是纯右值,会生成临时对象,C++标准明确禁止临时对象绑定到非const左值引用,所以编译器报错是符合标准的。
  • function1能正常编译,不是VS2019放宽了限制,而是*std::make_unique<SomeClass>()的结果根本不是临时对象:
    • std::make_unique会在堆上创建SomeClass对象,并返回一个std::unique_ptr<SomeClass>。
    • std::unique_ptr的operator*()返回的是SomeClass&——也就是指向堆上对象的左值引用。解引用这个引用得到的是堆上的SomeClass对象本身,属于左值,完全可以绑定到非const左值引用,这完全符合C++ ISO标准的规定。

简单说,两者的核心区别是:SomeClass()生成的是栈上临时对象(纯右值),而*make_unique指向的是堆上的持久对象(左值),所以编译器的处理完全合规。

内容的提问来源于stack exchange,提问作者Prasad Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:37:10