无法使用运算符<<对于匿名对象

时间:2017-07-14 18:11:43

标签: c++ operator-overloading parameter-passing

在下面的代码中,我创建了一个使用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;
}

1 个答案:

答案 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;
}