【发布时间】:2020-08-09 11:14:32
【问题描述】:
据我了解,在以下代码中,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<<"INT\n"; }
A(char *b) : y(b) { std::cout<<"C STRING\n"; }
};
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),它会给我以下错误:invalid conversion from 'const char*' to 'char*' [-fpermissive]。为什么我不能将 const char* 转换为 char*?
【问题讨论】:
-
因为这是标准所要求的。给定
A b('g'),编译器会查找一个构造函数调用,该调用只涉及char(即'g')的一次隐式转换。它找不到接受char(通过值或const引用)的构造函数,但确实找到了接受int的构造函数。单个隐式转换可用于将char转换为int,因此编译器将'g'转换为int,然后调用接受int的构造函数。 -
是的,但是 explicit 关键字不应该通过不允许 any 隐式转换来避免这种情况吗?
-
@H-005 不,它只影响标记为
explicit的用户自定义转换函数,如您的代码中的A::A(int)。它不会影响像char到int这样的标准转换。 -
explicit关键字意味着A x = 2或A y = 'g'将失败,但A x(2)和A y('g')不会。它与隐式转换无关(例如将'g'从char转换为int)会影响调用哪个构造函数的选择。
标签: c++ constructor implicit-conversion c-strings explicit