Все функции-члены to_...
принимают аргумент исключительно с целью помочь с выводом аргумента шаблона, так что да, передавая инициализированный значением † экземпляр того же типа, который вы хотите использовать в качестве возвращаемого типа безопасен, хотя и неоправданно неэффективен.
Однако функции-члены to_...
существуют только для помощи сломанным компиляторам, которые должным образом не поддерживают шаблонные операторы преобразования - почему вы используете их в первую очередь? Чистый синтаксис был бы просто:
boost::array<int, 3> OneTwoThree() {
return boost::assign::list_of(1)(2)(3);
}
Обратите внимание, что я использовал boost::array<>
здесь, а не std::tr1::array<>
; причина в том, что библиотека Boost.Assign не знает (пока) о стандартных библиотеках TR1 / C ++ 11 и поэтому не специализируется должным образом на std::array<>
или std::tr1::array<>
. Чтобы самостоятельно добавить эту специализацию и, следовательно, заставить приведенный выше код работать с std::tr1::array<>
, добавьте следующий код после , включая заголовки Boost.Assign:
namespace boost { namespace assign_detail {
template<typename T, std::size_t sz>
type_traits::yes_type assign_is_array(std::tr1::array<T, sz> const*);
}}
(Примечание: протестировано только с Boost 1.48; в более ранних версиях может потребоваться другая специализация.)
† Синтаксис в вашем вопросе не конструкция по умолчанию, это инициализация значения.