这里进行的是哪种显式转换
Which kind of explicit conversion is done here?
这是在我的MVS2015中编译和工作的代码:
#define STRING_TEST "Test String"
using namespace std;
void test(char * str) {
cout << str;
}
int main ()
{
test(STRING_TEST);
}
我猜STRING_TEST被转换成char[11]。相反,因为我传递它没有&
,它创建一个char *指针?或者我错过了什么?
"Test string"
的类型是const char[12]
,而不是char[11]
(您忘记了' '
)。
你的代码相当于
test("Test String");
宏只是做一个查找+替换,所以它不是"转换"。
数组衰变成指针,在这里,char数组衰变成char*
。test
这样称呼它。然而,自const char* != char*
以来,这已经从c++中删除了。
您的代码中根本没有显式转换。
STRING_TEST
是一个宏,所以语句
test(STRING_TEST);
被预处理成
test("Test String");
将被编译。
"Test String"
是一个字符串字面值,因此当传递给函数时将隐式转换为const char *
。
因此,假设您的编译器符合标准,该语句将无法编译(因为不允许从const char *
(或从字符串文字到char *
)的隐式转换)。
然而,一些编译器确实允许这种隐式转换(出于向后兼容旧版本C的原因)。这些编译器通常可以通过启动诊断(例如,Microsoft编译器添加/Wall
命令行选项)来抱怨。
相关文章:
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- std::vector 范围构造函数可以调用显式转换吗?
- 从 uint8_t 到 int 的隐式转换出错了,当显式转换进展顺利时
- 从 int 显式转换为用户定义的类 c++
- 自动(toCast)显式转换是否计划在未来C++标准?
- 为什么C++隐式转换有效,而显式转换无效?
- 使用分配进行显式转换
- 使用 static_cast、dynamic_cast 或显式转换进行派生指向 Base 指针转换的指针不会调用 base 函数
- 返回语句中的C++11显式转换运算符/构造函数
- 如何解决Visual Studio 2012不支持显式转换运算符的问题
- 通过显式转换函数初始化枚举类类型的静态constexpr类成员
- C++ 为什么我们需要从一种类型显式转换为另一种类型
- 当显式转换是必需的并且隐式转换将不起作用时
- C++显式转换和隐式转换
- 如何争论多个显式转换函数
- C++显式转换构造函数
- 转换为枚举类型需要显式转换(static_cast、C样式转换或函数样式转换)
- 如何在模板中进行从本机类型到用户定义类型的显式转换
- 用户定义类(c++)是否有默认的显式转换函数
- 这里进行的是哪种显式转换