Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向量构造函数中的函数匹配_C++_Vector_Constructor - Fatal编程技术网

C++ 向量构造函数中的函数匹配

C++ 向量构造函数中的函数匹配,c++,vector,constructor,C++,Vector,Constructor,这对我来说意味着向量首先使用string对象直接初始化一个临时HasPtrValue对象(执行HasPtrValue),然后从这个临时对象复制构造5个元素。那么,为什么以下代码不编译: string/default copy copy copy copy copy intmain(){ 向量a(5,“堆栈溢出”); } 如果它直接初始化HasPtrValue(执行HasPtrValue(“stackoverflow”)),那么担任创建临时值角色的const字符串和构造函数将不会出现问题。我得

这对我来说意味着向量首先使用string对象直接初始化一个临时HasPtrValue对象(执行HasPtrValue),然后从这个临时对象复制构造5个元素。那么,为什么以下代码不编译:

string/default
copy
copy
copy
copy
copy
intmain(){
向量a(5,“堆栈溢出”);
}
如果它直接初始化HasPtrValue(执行HasPtrValue(“stackoverflow”)),那么担任创建临时值角色的const字符串和构造函数将不会出现问题。我得到了错误

int main(){
    vector<HasPtrValue> a(5, "stackoverflow");
}
错误:调用'std::vector::vector(int,const char[14])时没有匹配的函数|
我想我应该尝试使用一个更简单的类,它使用int构造函数并从double转换:

 error: no matching function for call to 'std::vector<HasPtrValue>::vector(int, const char [14])'|
A类{
公众:
A(常数int&A):x(A){}
int x=2;
};
int main(){
载体a(5,5.5);
}

除了这本书没问题。向量实现的哪一部分阻止在构造函数中使用const char*转换

因为它需要两个用户定义的转换,
const char*
->
std::string
,然后是
std::string
->
HasPtrValue
,但在隐式转换序列中只允许一次用户定义的隐式转换

13.3.3.1.2$1用户定义的转换序列[超过ics用户]

用户定义的转换序列由初始标准组成 用户定义转换后的转换顺序(12.3) 然后是第二个标准转换序列

注意这里只有一级用户定义的隐式转换是合法的。对于您的情况,这必须通过显式转换来处理;因此,您可以:

class A{
public:
    A(const int& a): x(a) { }
    int x = 2;
};

int main(){
    vector<A> a(5, 5.5);

}
向量a(5,std::string(“stackoverflow”);
int main(){
向量a(5,字符串(“堆栈溢出”);
}
构造函数需要
std::string
,“stackoverflow”是
char
数组。
或者,您可以定义其他构造函数,以接受已给出答案的可能重复项。只需添加以下内容:
HasPtrValue(constchar*s):ps(新的std::string)){std::cout或自c++14
以来的“stackoverflow”s
class A{
public:
    A(const int& a): x(a) { }
    int x = 2;
};

int main(){
    vector<A> a(5, 5.5);

}
vector<HasPtrValue> a(5, std::string("stackoverflow"));
int main(){
    vector<HasPtrValue> a(5, string("stackoverflow"));
}