C++ 向量构造函数中的函数匹配
这对我来说意味着向量首先使用string对象直接初始化一个临时HasPtrValue对象(执行HasPtrValue),然后从这个临时对象复制构造5个元素。那么,为什么以下代码不编译: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/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"));
}