是std :: vector <bool> :: resize standard的最终默认参数吗?</bool>

时间:2015-03-18 09:21:09

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

我的编译器(MSVC2012)的最终参数

的默认值为false

std::vector<bool>::resize(std::vector<bool>::size_type, bool)

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

我不认为对于非专业化的resize是正确的,其中由于大小增加而引入的任何元素都是而不是已初始化。

http://en.cppreference.com/w/cpp/container/vector_bool似乎没有说清楚。

3 个答案:

答案 0 :(得分:5)

  

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

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

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

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

是的;虽然由于C ++ 11是通过两个重载而不是默认参数实现的,所以如果你没有指定一个值,它们就会被初始化而不是从一个初始值初始化的复制。

答案 1 :(得分:3)

来自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<bool>,该函数可以声明为

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

答案 2 :(得分:1)

17.6.5.5 [member.functions]说:

  

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

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

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

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

void resize(size_type, bool = false);

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