2016-09-18 108 views
0

我已經發現有用的答案,爲什麼它不應該是不可能的:
Why does C# limit the set of types that can be declared as const?
Why can't structs be declared as const?
第一個有一個詳細的解答,我還是要重新讀幾次,直到我完全弄它。
第二個有一個非常簡單和明確的答案(如'構造函數可能會做任何事情,所以它必須在編譯時運行和評估')。
但都提到C#。爲什麼我可以在C++/CLI中聲明const結構,而不是在C#中聲明?

不過,我使用C++/CLI,有一個

value class CLocation 
{ 
public: 
    double x, y, z; 

    CLocation (double i_x, double i_y, double i_z) : x(i_x), y(i_y), z(i_z) {} 
    CLocation (double i_all) : x(i_all), y(i_all), z(i_all) {} 

    ... 
} 

,我可以輕鬆地創建一個

const CLoc c_loc (1,2,3); 

這的確是不可改變的,意思是 '常量'。

爲什麼?

CLocation還具有功能

System::Drawing::Point CLocation::ToPoint() 
{ 
    return System::Drawing::Point (x_int, y_int); 
} 

其上CLocation效果很好,但不上const CLocation。我認爲這來自C#中的限制(從上面的鏈接中可以得知),這可能來自底層IL,因此C++/CLI也受到相同限制的影響。

這是正確的嗎?
有沒有辦法在const CLocation上運行這個成員函數?

+0

ToPoint()函數是一個const違例,它不是一個const函數。 C++/CLI在它可以的時候支持const,但它不完美,因爲.NET元數據不允許在C++中有效的表達它。就像在函數上一樣,它必須使用的[modopt]在方法上無效。改用'initonly'。 –

回答

0

您必須向編譯器指示您的函數不會通過在參數列表後面添加const來更改對象。

然後可以在const變量上調用您的函數,但可能不會修改其字段。

還請注意,某些關鍵字(包括conststruct)在C#和C++(以及基於C的其他語言)中具有不同的含義。

更新

由於CPP/CLI不允許在一個成員函數const修改,你必須給變量複製到非const一個能夠調用的任何成員函數(在副本上)。

+0

已經嘗試過。聲明'System :: Drawing :: Point ToPoint()const;'產生:錯誤C3842:'ToPoint':模塊Qualifizierer'const'和'volatile'將會成爲成員函數的一部分。 (來自MSDN的原始消息:'function':不支持WinRT或託管類型的成員函數上的'const'和'volatile'限定符) –