C++ 为什么参数中的默认字符*必须是常量?

C++ 为什么参数中的默认字符*必须是常量?,c++,c++11,visual-c++,C++,C++11,Visual C++,如果我遵守此规定,编译器将向我发送警告: 警告:已弃用从字符串常量到“char*”的转换 除非我将参数从char*pchString=“0”修改为const char*pchString=“0” 为什么参数中的默认字符*必须是常量?原因是,与使用字符串类相比,字符*被认为是过时的做法 因为像“some string”这样的字符串文本是不可变的,尝试修改一个(如果通过非常量引用传递,可以尝试修改它们)会导致未定义的行为。这就是为什么标准C++不赞成这个转换的原因。 尝试这个游戏(但请不要在生产代码

如果我遵守此规定,编译器将向我发送警告:

警告:已弃用从字符串常量到“char*”的转换

除非我将参数从
char*pchString=“0”
修改为
const char*pchString=“0”


为什么参数中的默认字符*必须是常量?

原因是,与使用字符串类相比,字符*被认为是过时的做法

因为像
“some string”
这样的字符串文本是不可变的,尝试修改一个(如果通过非常量引用传递,可以尝试修改它们)会导致未定义的行为。这就是为什么标准C++不赞成这个转换的原因。 尝试这个游戏(但请不要在生产代码中),现场:

#包括
int main()
{
char*str=“测试”;
str[0]=“w”;

std::cout当您使用字符串文本时,例如
“0”
,它被放在程序的只读部分。对这些数据进行任何更改都会导致未定义的行为。通过尝试将
char*
类型的变量初始化为sting文本,您允许修改只读数据。这就是编译器所抱怨的

它类似于:

#include <iostream>

int main() 
{
    char* str = "test";
    str[0] = 'w';
    std::cout << str; // oops
}

这与C++的默认参数无关。C++中的字符串文字是<代码> const <代码>,不管你在哪里使用。@ Juen Khaw,你可能想改变你的“关于我:”到“代码> const char *chSTAT=“初学者”;< /代码>:“vSoTCO,LoLS,u对我很不好:PThis根本就不与<代码>字符串< /Cord>类无关。
#include <iostream>

int main() 
{
    char* str = "test";
    str[0] = 'w';
    std::cout << str; // oops
}
const int num;
int* ptr = &num;  // Wrong