二进制表达式中的 GCC 常量临时
Posted
技术标签:
【中文标题】二进制表达式中的 GCC 常量临时【英文标题】:GCC constant temporary in binary expression 【发布时间】:2012-09-24 20:57:28 【问题描述】:考虑以下代码:
struct A
A& add( int i ) return *this;
;
A& operator+=( A& a, int i ) return a;
void f()
A a1 = A().add( 1 ); // expr 1
A a2 = A() += 1; // expr 2
表达式 1 和 2 都被 VC 接受。表达式 2 被 GCC 拒绝,并显示“没有可行的重载 '+='”。但是,对于引用常量对象的运算符来说,这样的表达式是可以接受的:
const A& operator+=( const A& a, int i ) return a;
为什么 GCC 在不在方法调用上下文中时强制这个临时变量在操作符上下文中保持不变,这是正确的行为吗?
【问题讨论】:
在 MSVC 中调高警告级别,它会告诉你答案。 【参考方案1】:A();
临时创建。
A& operator+=( A& a, int i ) return a;
临时不能绑定到reference
。 MSVC 接受这一点,因为它是非标准扩展。看rvalue to lvalue conversion Visual Studio
【讨论】:
我不确定我是否会称其为错误,因为 MSVC 会发出警告说这是官方未定义的。 至于为什么第一个表达式有效,C++允许在临时对象上调用非常量成员函数。以上是关于二进制表达式中的 GCC 常量临时的主要内容,如果未能解决你的问题,请参考以下文章
Java 虚拟机原理Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | info[] | 完整分析字节码文件中的常量池二进制数据 )
C++ 协议缓冲区:常量表达式中的临时非文字类型 'google::protobuf::internal::CallOnInitializedMutex <std::mutex>'