为什么将char *传递给字符串参数会产生编译错误?

时间:2017-06-01 14:51:17

标签: c++

我使用以下代码进行原型设计。

#include <vector>
#include <iostream>
#include <algorithm>
#include <string>


template<class container, class value> class Add {
public:
    Add(){};
    ~Add(){};
    void add_value(container& cont, value& val){
        std::for_each(cont.begin(), cont.end(), [&val](value& v){v +=val;});
    };
};


int main(int argc, char const *argv[])
{
    Add<std::vector<std::string>, std::string> a;
    std::vector<std::string> vec = {"a", "b", "c", "d"};
    std::string foo= "1";
    a.add_value(vec, foo); // compiles fine
    a.add_value(vec, "1"); // generates an error
    return 0;
}

我收到了以下错误

template.cpp:28:25: error: invalid initialization of non-const reference of type ‘std::__cxx11::basic_string<char>&’ from an rvalue of type ‘std::__cxx11::basic_string<char>’

为什么无法将char*传递给string参数?

据我所知,为了将char*转换为std::string,将执行隐式转换,结果将传递给函数。

1 个答案:

答案 0 :(得分:4)

您将add_value定义如下:

void add_value(container& cont, value& val)

如果字符串是非const引用,编译器希望此引用指向其他位置的可修改变量。

但是,当您传递const char[]时,即使此类型可以转换为字符串(如果它将编译),它也会在运行中完成,并且字符串不可修改。实际上,char*也不可修改。这就是你的代码无法编译的原因。

您可以将您的功能定义如下,它可以工作:

void add_value(container& cont, const value& val)