根据我的理解,在以下代码中,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
关键字可防止从int
到A
的隐式转换。但是,当直接调用A
构造函数时,它并不影响char
到int
转换的可能性。
换句话说,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
,但请注意这是危险的,例如,试图修改字符串文字会导致未定义的行为。