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

最佳答案

TestObject()产生一个临时的TestObject。由于它不是临时的,因此无法将其绑定(bind)到左值引用(except for MSVS's evil extension)。如果您的运算符(operator)不需要修改TestObject,则只需将其更改为const&就足够了:

template <typename T>
const TestObject& operator<<(const TestObject& o, const T& t)
{
   return o;
}

如果需要修改该值,则需要添加另一个重载并使用右值引用。这将绑定(bind)到临时文件,并允许您对其进行修改:
template <typename T>
TestObject& operator<<(TestObject&& o, const T& t)
{
   return o;
}

关于c++ - 无法对匿名对象使用operator <<,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45109314/

10-12 06:21