2

好的,这适用于我的编译器(vs2008),但我试图弄清楚我是否在做一些非标准的事情。这是我正在做的一个简单的例子:

std::tr1::array<int, 3> OneTwoThree() {
    return boost::assign::list_of(1)(2)(3).to_array(std::tr1::array<int, 3>());
}

我在欺骗 to_array 适配器实际上并没有使用您传递给它的参数,它只是使用它来确定类型。然而,这些例子表明它更像是这样使用的:

std::tr1::array<int, 3> a = boost::assign::list_of(1)(2)(3).to_array(a);

关于是否只是将值初始化的数组放入 to_array 是否是犹太教的任何想法?有没有更清洁的方法来做到这一点?

4

1 回答 1

3

成员函数都接受一个参数,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<>or std::tr1::array<>。要自己添加此特化,并因此使上述代码与 . 一起使用,请在包含 Boost.Assign 标头std::tr1::array<>添加以下代码:

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 进行测试;早期版本可能需要不同的专业化。)


您问题中的语法不是默认构造,而是值初始化。

于 2011-11-28T21:46:42.420 回答