在下面的代码中,我创建了一个使用operator<<<<<<并相应地处理变量。为简单起见,省略了该类内部的确切逻辑。清晰度。
我面临的问题是,当我尝试创建对象的匿名实例,并直接与(<<<<)运算符一起使用时,大多数编译器都会抱怨 - 这就是(不匹配'运营商<<<')
据我所知,直接调用类( TestObject())是一个合法的表达式,它应该实例化一个传递给运算符的匿名对象。
感谢您对为什么不编译的想法?
typedef unsigned int uint32;
class TestObject
{
public:
TestObject()
: mValue(0)
{
}
uint32 GetValue() const
{
return mValue;
}
private:
uint32 mValue;
};
template <typename T>
TestObject& operator<<(TestObject& o, const T& t)
{
return o;
}
void TestObjectTest()
{
TestObject myTestObject;
uint32 newValue = 123;
const uint32 resultValue = (myTestObject << newValue).GetValue(); // This compiles for both visual studio 2013 and gcc.
const uint32 resultValue2 = (TestObject() << newValue).GetValue(); // Compiles using visual studio 2013, but does not compile using x86-64 gcc 6.2: "no match for 'operator<<' in 'TestObject() << newValue'
}
int main(void)
{
TestObjectTest();
return 0;
}
答案 0 :(得分:3)
TestObject()
会产生一个临时TestObject
。由于它不是临时的,因此您无法将其绑定到左值引用(except for MSVS's evil extension)。如果您的运营商不需要修改TestObject
,那么只需将其更改为const&
即可:
template <typename T>
const TestObject& operator<<(const TestObject& o, const T& t)
{
return o;
}
如果您需要修改该值,则需要添加另一个重载并接受右值引用。这将绑定到临时,并允许您修改它:
template <typename T>
TestObject& operator<<(TestObject&& o, const T& t)
{
return o;
}