【问题标题】:const boost::array<T,N> or boost::array<const T,N>?const boost::array<T,N> 还是 boost::array<const T,N>?
【发布时间】:2011-04-09 09:04:21
【问题描述】:

这两者有什么区别?当您需要一个固定大小的常量值数组时,您更喜欢哪一个?

const boost::array<int, 2> x = {0, 1};
boost::array<const int, 2> y = {0, 1};

谢谢。

【问题讨论】:

    标签: c++ arrays constants


    【解决方案1】:

    第二个会阻止你将它复制到一个新的非常量数组中

    boost::array<const int, 2> y = {0, 1};
    boost::array<int, 2> y1 = y; // error!
    

    由于我希望这能奏效,我可能会选择第一个选项。将第二个传递给期望 boost::array&lt;T, N&gt; 的模板将阻止这些模板修改其参数(即使它是副本)。第一个将“正常工作”,因为参数的类型为boost::array&lt;int, 2&gt;。

    【讨论】:

    • 谢谢!顺便说一句,为什么通过值忽略 const 限定符?参数类型推导是如何工作的?
    • @pic 是的。它认为这是一件好事。请参阅cpp-next.com/archive/2011/04/…上的 cmets
    • 绍布。是的,这很有意义。感谢您的链接。
    【解决方案2】:

    这确实是一种风格上的差异。

    如果您尝试在 const array 上调用 assign,编译器错误会显示没有匹配的函数。如果您对array&lt;const T&gt; 执行相同操作,则它指向assign 内部的无效操作。

    我认为const array 更好地表达了意图,并且看起来更像对应的 C 样式数组声明。但我不会努力改变事情,例如在遗留代码中或在可能生成array&lt;const T&gt; 的模板中。

    【讨论】:

    • 我将使用 const 数组。谢谢。
    【解决方案3】:

    const int 和 int 在这种情况下几乎相同。您对array&lt;int,2&gt; 无能为力,而对array&lt;const int, 2&gt; 则无能为力。如果你有一些课程而不是int,那么会有区别。使用array&lt;const MyClass, 2&gt;,您将无法对数组元素调用非常量方法。
    const array&lt;MyClass, 2&gt; 更强大,因为您无法修改任何内容。你不能调用元素的非常量方法并且你不能通过替换元素来改变数组本身,比如使用operator[]。

    【讨论】:

    • 你也不能通过operator[]替换元素在另一个选项下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多