数字类型和字符串的模板函数和

Moh*_*mel 2 c++ templates

我正在玩模板.我有以下模板来总结矢量的元素:

#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它不是字符串的有效值(我认为).
我的问题是为什么我没有收到任何错误?因为它能够编译它应该运行,不是吗?

Bo *_*son 5

你走在正确的轨道上.因为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{}用作参数的默认值.这适用于任何默认的可构造类型.