【问题标题】:Implicit casting limitations隐式转换限制
【发布时间】:2019-10-04 15:10:05
【问题描述】:

我正在尝试支持类型系统中文字值的隐式转换。这些隐式转换是有意的和理想的(见注 1)。我知道 C++ 可以在一个表达式中执行多个隐式转换。下面main的第二行不行。

class A {
public:
    A(const std::string&);
};

class B {
public:
    B(const A&);
};

int main(void)
{
    A("example");  // this works
    B("example");  // this does not work
}

如果我在 A 中添加一个 const char* 构造函数,则第二行有效...

class A {
public:
    A(const char*);
    A(const std::string&);
};

class B {
public:
    B(const A&);
};

int main(void)
{
    A("example");  // this works
    B("example");  // now it works
}

为什么第一个实现不起作用?第二行可以将const char*构造成std::string,然后构造成A,最后构造成B

注1:隐式可转换类型的值是相同的值,该类型仅表示该值已通过前置条件,通过操作保持其条件,并通过对相似类型的操作传播该条件。隐式转换允许将类型转换为具有较弱前置条件的其他类型。

【问题讨论】:

标签: c++ implicit-conversion


【解决方案1】:

与标准转换不同,implicit conversion sequence 最多可以包含一个用户定义的转换。

隐式转换序列包含以下内容,按此顺序:

1) 零个或一个标准转换序列;

2) 零次或一次用户自定义转换;

3) 零个或一个标准转换序列。

对于您的第一个代码 sn-p,给定 B("example");,需要两次用户定义的转换; const char*std::stringstd::stringA

作为解决方法,您可以尝试添加另一个转换构造函数,或者添加显式转换以构造B,例如

B(A("example"));

【讨论】:

  • 那太糟糕了。解决此问题的唯一方法是将系统中每种类型的隐式转换添加到其他所有类型吗?我希望使我的库增量,只包括你使用的,这会抑制它。每种类型都需要其他类型的定义,因此您只能包含整个内容。
【解决方案2】:

要实现隐式转换,您必须将数据类型放在括号之间,然后是变量(int)(var)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多