gpt4 book ai didi

c++ - 数字类型和字符串的模板函数总和

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:51 25 4
gpt4 key购买 nike

我正在玩弄模板。我有以下模板来对 vector 的元素求和:

#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;
}

它对数字类型工作得很好。但是如果我尝试传递一个字符串 vector ,我不会得到任何编译错误,但是函数没有被调用。这是我的功能 main :

int main(int argc, char** argv) {

vector<string> s {"Hello" , " ", "There" };


cout<<"Before calling the function\n";
cout<<sum(s);

return 0;
}

我刚刚明白

Before calling the function

作为输出。如果我将函数调用更改为 cout<<sum(s, string(" "));该功能按预期工作。我猜这与我定义默认参数的方式有关 0不是字符串的有效值(我认为)。
我的问题是为什么我没有收到任何错误?因为它能够编译它应该运行,不是吗?

最佳答案

您走在正确的轨道上。对于 std::string,值 0nullptr 相同,并且匹配采用 const char* 的构造函数.

但是,将空指针传递给该构造函数是未定义的行为。未定义的行为意味着任何都可能发生。

标准说:

basic_string(const charT* s, const Allocator& a = Allocator());

Requires: s points to an array of at least traits::length(s) + 1 elements of charT.

Effects: Constructs an object of class basic_string and determines its initial string value from the array of charT of length traits::length(s) whose first element is designated by s, as indicated in Table 67.

因此,如果s为null(或0),则它不指向charT数组,前提是违反了。


顺便说一下,您可以使用 summable{} 作为参数的默认值。这适用于任何默认的可构造类型。

关于c++ - 数字类型和字符串的模板函数总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35534505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com