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