为什么"显式"关键字不能阻止"char"转换为"int"?



根据我的理解,在以下代码中,explicit A(int a)应该阻止A b('g');使用int构造函数:

#include <iostream>
class A
{
public:
int x;
char *y;
A() : x(0) {}
explicit A(int a) : x(a) { std::cout<<"INTn"; }
A(char *b) : y(b) { std::cout<<"C STRINGn"; }
};
int main()
{
A a(5); /// output: "INT"
A b('g'); /// output: "INT"
A c("Hello"); /// output: "C STRING"
}

但是,A b('g');使用int构造函数。。。为什么?

另外,还有一个问题:如果我写A(const char *b)而不是A(char *b),会出现以下错误:从"const char*"到"char*"的转换无效[-fpermission]。为什么我不能将const char*转换为char*

explicit关键字可防止从intA的隐式转换。但是,当直接调用A构造函数时,它并不影响charint转换的可能性。

换句话说,explicit只影响到类A的转换,但不影响构造函数参数的任何可能转换。

您使用的是直接初始化,它确实考虑了explicit构造函数。

直接初始化比复制初始化更宽松:复制初始化只考虑非显式构造函数和非显式用户定义转换函数,而直接初始化考虑所有构造函数和所有用户定义转换功能。

给定A b('g');'g'char,可以隐式转换为int,然后调用A::A(int)来初始化对象。

另一方面,像A a = 5;A b = 'g';这样的复制初始化不起作用。

此外,复制初始化中的隐式转换必须直接从初始值设定项生成T,而例如,直接初始化需要从初始值设置项隐式转换为T的构造函数的参数。

关于

为什么我不能将const char*转换为char*

const char*无法隐式转换为char*。您可以使用const_cast,但请注意这是危险的,例如,试图修改字符串文字会导致未定义的行为。

最新更新