2015-08-28 70 views
1
#include <string> 
#include <iostream> 
#include <vector> 

class HasPtrValue { 
public: 
    HasPtrValue(const HasPtrValue& h): ps(new std::string(*h.ps)) { std::cout << "copy" << std::endl;} 
    HasPtrValue(const std::string &s = std::string()): ps(new std::string(s)) { std::cout << "string/default" << std::endl;} 
    ~HasPtrValue() { delete ps; } 
private: 
    std::string *ps; 
}; 

using namespace std; 

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

上述代码功能匹配编译好输出:在矢量构造

string/default 
copy 
copy 
copy 
copy 
copy 

这表明对我的向量第一直接初始化使用字符串对象的临时HasPtrValue对象(做HasPtrValue(S))和然后从这个临时文件中复制构建5个元素。怎么来的,那么,下面的代码无法编译:

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

如果它是直接初始化的HasPtrValue(做HasPtrValue(“计算器”)),那么将在常量字符串&构造占用没有问题创建临时角色。我得到错误;

error: no matching function for call to 'std::vector<HasPtrValue>::vector(int, const char [14])'| 

我想我有一个使用int构造和转换从双简单的类尝试:

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

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

} 

除本编译罚款。向量实现的哪些部分阻止在构造函数中使用const char *转换?

+0

[链接隐式转换运算符]的可能重复(http://stackoverflow.com/questions/8610511/chaining-implicit-conversion-operators) –

+0

答案已经给出。只需加上: 'HasPtrValue(const char * s):ps(new std :: string(s)){std :: cout <<“string/constcharptr”<< std :: endl; }' –

回答

3

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

13.3.3.1.2 $ 1用户定义的转换序列[over.ics.user]

甲用户定义的转换序列由初始标准 转换序列和其后的用户自定义的转换的(12.3) 后跟第二个标准转换序列。

注意这里只有一个级别的用户定义的隐式转换是合法的。对于你的情况,这必须通过明确的转换来处理;所以,你可以:

vector<HasPtrValue> a(5, std::string("stackoverflow")); 
+2

或者自C++ 14''stackoverflow“s'。 – Jarod42

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

你的构造函数需要std::string和 “计算器” 是char阵列。 或者,您可以定义接受char[]的其他构造函数。