По возможности избегайте const_cast
, и здесь это вполне возможно для любого данного типа.Просто создайте вспомогательную функцию, которая принимает два аргумента, составляет окончательное значение константы и использует его в инициализаторе:
// header file
struct test {
const type x;
test( type const & a, type const & b );
};
// implementation file
namespace {
type compose( type const & arg1, type const & arg2 ) {
// calculate the actual value here
}
}
test::test(type const & a, type const & b)
: x( compose(a,b) )
{}
Стоимость этого - просто запись одного свободного (static
или вбезымянного пространства имен) в файле реализации, и результат будет читаем, если вы выберете правильное имя для функции.В вашем случае: concatenate
или concat
будет хорошим выбором.
Хотя использование const_cast
в примере не приведет к неопределенному поведению, я бы избегал его по личным причинам.Приводы громоздки для написания на C ++ (сравните с C или Java) по причине: так что они привлекут внимание программиста: что-то странное происходит здесь! Если вы начнете разбрасывать приведение, то выпривыкнет видеть их, и они станут естественными.