2016-09-18 8 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#.Почему я могу объявлять конструкции const в C++/CLI, но не в 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, но не может изменять ее поля.

Обратите внимание, что некоторые ключевые слова (включая const и struct) имеют разные значения в C# и C++ (и другие языки на основе C).

Update

Как CPP/CLI не позволяет const модификатор функции члена, вы должны скопировать переменную в не- const один, чтобы иметь возможность вызвать любую функцию члена (на копии).

+0

попробовал это уже. объявление 'System :: Drawing :: Point ToPoint() const;' производит: ошибка C3842: 'ToPoint': Die Qualifizierer 'const' und 'volatile' für Memberfunktionen von verwalteten Typen werden nicht unterstützt. (оригинальное сообщение englisch из MSDN: «функция»: «const» и «volatile» квалификаторы для функций-членов WinRT или управляемых типов не поддерживаются) –

 Смежные вопросы

  • Нет связанных вопросов^_^