我正在玩模板.我有以下模板来总结矢量的元素:
#include<vector>
#include <iostream>
template <class summable>
summable sum (const std::vector<summable> data, summable initial_value = 0){
std::cout<<"in the function"<<std::endl;
for (auto i : data){
initial_value += i;
}
return initial_value;
}
Run Code Online (Sandbox Code Playgroud)
它对数字类型工作得非常好.但是如果我尝试传递一个字符串向量,我不会得到任何编译错误但是函数没有被调用.这是我的功能main:
int main(int argc, char** argv) {
vector<string> s {"Hello" , " ", "There" };
cout<<"Before calling the function\n";
cout<<sum(s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到了
在调用函数之前
作为输出.如果我改变函数调用 cout<<sum(s, string(" "));函数按预期工作.我猜它与我定义默认参数的方式有关,因为0它不是字符串的有效值(我认为).
我的问题是为什么我没有收到任何错误?因为它能够编译它应该运行,不是吗?
你走在正确的轨道上.因为std::string值与构造函数0相同nullptr,并且匹配构造函数const char*.
但是,将空指针传递给该构造函数是未定义的行为.未定义的行为意味着任何事情都可能发生.
标准说:
basic_string(const charT* s, const Allocator& a = Allocator());
Run Code Online (Sandbox Code Playgroud)
要求:
s指向至少traits::length(s) + 1元素的数组charT.效果:构造一个类的对象,
basic_string并从其charT长度为traits::length(s)第一个元素的数组中确定其初始字符串值s,如表67所示.
因此,如果s为null(或0),则它不指向数组charT,并且违反了前提条件.
顺便说一句,您可以将其summable{}用作参数的默认值.这适用于任何默认的可构造类型.
| 归档时间: |
|
| 查看次数: |
350 次 |
| 最近记录: |