【问题标题】:Is the final default argument of std::vector<bool>::resize standard?std::vector<bool>::resize 的最终默认参数是标准的吗?
【发布时间】:2015-03-18 09:21:08
【问题描述】:

我的编译器 (MSVC2012) 的最后一个参数默认为 false

std::vector&lt;bool&gt;::resize(std::vector&lt;bool&gt;::size_type, bool)

这是标准 C++ 还是 Microsoft 扩展?

我认为对于非专业化的 resize 而言并非如此,因为尺寸增加而引入的任何元素都没有初始化。

http://en.cppreference.com/w/cpp/container/vector_bool 好像没说清楚。

【问题讨论】:

  • “对于不专业的resize肯定不是这样的”这是不正确的。
  • 抱歉,我认为我现在的原型是正确的。

标签: c++ visual-c++ vector


【解决方案1】:

这是标准 C++ 还是 Microsoft 扩展?

是的,默认参数是标准的。 C++11 [vector.bool] 指定

void resize(size_type sz, bool c = false);

我不认为非专业调整大小是正确的,因为大小增加而引入的任何元素都不会被初始化。

是的,是的;尽管从 C++11 开始,这是通过两个重载而不是默认参数实现的,因此如果您不指定值,它们是值初始化的,而不是从值初始化的临时值复制而来。

【讨论】:

  • Plusone 提到了 03 和 11 之间的细微变化。
【解决方案2】:

来自 C++ 标准

void resize(size_type sz, bool c = false);

至于通用类std::vector则函数重载

void resize(size_type sz);
void resize(size_type sz, const T& c);

并且对于第一个函数元素是默认插入的。

我认为对于std::vector&lt;bool&gt;,该函数可以声明为

void resize(size_type sz, bool c = bool());

【讨论】:

    【解决方案3】:

    17.6.5.5 [member.functions] 说:

    一个实现可以在一个类中声明额外的非虚拟成员函数签名:
    — 通过将具有默认值的参数添加到成员函数签名;187 [注意: 实现可能不会将具有默认值的参数添加到虚拟、全局或非成员函数。 — 尾注]
    — 通过用两个或多个具有等效行为的成员函数签名替换具有默认值的成员函数签名;和
    — 通过为成员函数名称添加成员函数签名。
    对 C++ 标准库中描述的成员函数签名的调用表现得好像实现没有声明额外的成员函数签名。

    这允许实现添加/删除默认参数,因此完全符合替换这两个签名:

    void resize(size_type);
    void resize(size_type, bool);
    

    使用带有默认参数的单个函数:

    void resize(size_type, bool = false);
    

    对于非专业化的vector&lt;T&gt;::resize(),C++11 标准从一个函数(带有默认参数)更改为两个重载,因此调用 1 参数形式不再需要类型为 CopyConstructible。实现不能使用默认参数,因为这会违反上面引用的最后一行,因为行为会有所不同。这与vector&lt;bool&gt; 无关,因为我们一直都知道bool 是CopyConstructible,所以实现可以选择是定义一个vector&lt;bool&gt;::resize 成员函数还是两个。

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多