2017-07-14 55 views
1

在我的代碼中,我創建了一個類,該類使用運算符< <來接收變量並相應地處理這些變量。爲了簡潔起見,省略類內部的確切邏輯。無法使用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

你不應該是能夠結合臨時到非const引用我很驚訝在VS – Borgleader

回答

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; 
} 
+1

,編譯註意,首次解決方案需要顯式的刪除返回時的常量。 –

+0

@ Jean-BaptisteYunès好的電話。我只是改變它返回一個'const&'。 – NathanOliver

+0

它是否有效返回一個參考右值參考參數?當臨時論證被破壞時,這不是一個「懸而未決」的參考嗎? – zett42