【问题标题】:sequence of conversions with contsructor-type conversions and conversion operators具有构造函数类型转换和转换运算符的转换序列
【发布时间】:2011-04-17 16:22:48
【问题描述】:

我读过标准转换可以在转换运算符或构造函数类型转换实现的转换之前或之后。另一方面, 不允许使用两个转换运算符的序列
不允许两个构造函数类型转换的序列

我开始对此进行测试并得到了不同的结果。我正在使用 MSVC2010

在第一组代码中失败了: int b1 = sMe;这很棒,因为它暗示了两个转换运算符的序列:一个从 myString 到 myType,另一个从 myType 到 int

在第二组代码中,这不会失败:myString sYou(b);虽然我相信这意味着两个构造函数转换的序列:一个从 int 到 myType,另一个从 myType 到 myString。

有人可以向我解释我缺少什么吗?

非常感谢,

第一批

class myType {
public:
    myType(): val(10) {}
    myType(const myType &orig): val(orig.val) {}
    myType(int v1): val(v1) {} 

    bool hasSameValue(const myType &o2) {
        return (o2.val == val); }
    int getVal() {
        return val; }
    operator int() { return val; }

private:
    int val;

};


#include <string>
class myString {
public:
    myString(): val("I Dont Know you") {}
    myString(const myString &orig): val(orig.val) {}
    myString(myType v1): val("Really Dont know you") {} 

    bool hasSameValue(const myString &o2) {
        return (o2.val == val); }
    std::string getVal() {
        return val; }
    std::string getString() {return val;}

    operator myType() { return 1000; }


private:
    std::string val;

};




#include <iostream>
using namespace std;

int main() {

    int b = 36;

    myString sMe;
    myString sYou(b);
    cout << "sYou: " << sYou.getString() << endl;
    cout << "sMe: " << sMe.getString() << endl;

    myType a = sMe;
    cout << a.getVal() << endl;
    int b1 = sMe;

    return 1;

}

第二批

class myType {
public:
    myType(): val(10) {}
    myType(const myType &orig): val(orig.val) {}
    myType(int v1): val(v1) {} 

    bool hasSameValue(const myType &o2) {
        return (o2.val == val); }
    int getVal() {
        return val; }

private:
    int val;

};


#include <string>
class myString {
public:
    myString(): val("I Dont Know you") {}
    myString(const myString &orig): val(orig.val) {}
    myString(myType v1): val("Really, I Dont Know you") {} 

    bool hasSameValue(const myString &o2) {
        return (o2.val == val); }
    std::string getVal() {
        return val; }
    std::string getString() {return val;}


private:
    std::string val;

};




#include <iostream>
using namespace std;

int main() {
    myType me;
    int a = 34;
    int b = 36;

    myType you(a);
    bool sameVal = you.hasSameValue(b);  
    cout << sameVal << endl;
    cout << "you: " << you.getVal() << endl;
    cout << "me: " << me.getVal() << endl;

    myString sMe;
    myString sYou(b);
    cout << "sYou: " << sYou.getString() << endl;
    cout << "sMe: " << sMe.getString() << endl;


    return 1;

}

【问题讨论】:

    标签: c++ constructor conversion-operator


    【解决方案1】:

    myString sYou(b); 只涉及一次隐式转换。第二次转换是显式;您正在调用构造函数。所以它编译了。

    相反,以下将编译:

    void func(myString blah) { ... }
    
    func(b);
    

    因为这需要两次隐式转换。

    【讨论】:

    • 您好 Oli,所以本质上,操作数在第二次转换中匹配的事实使其合法。只有两个构造函数转换的序列在它们都是隐式的时候是不合法的。对吗?
    • @Random:就是这样。编译器只会进行 一个 隐式转换以满足参数列表。
    • @oli:由于转换运算符的存在,第一束代码中的两种转换都不是显式的吗?如果这是正确的,他们仍然不编译
    • @Random: 在这种情况下,“隐式”意味着编译器必须从上下文中推断出要做什么,而不是被明确告知。所以在第一个例子中,编译器必须推断myString->myType->int,而在第二个例子中,它只需要推断int->myType
    猜你喜欢
    • 2018-08-12
    • 2010-11-25
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2012-07-12
    • 2014-02-17
    相关资源
    最近更新 更多