为什么新的 Visual Studio 将字符串文字作为指向常量的指针?

Usa*_*ved 1 c++ constants visual-studio

我为我的班级学生提供了这个构造函数。

student::student( char* rollno ,   char* name , date dob) :
    rollno(rollno), name(name),dob(dob)
{
}
Run Code Online (Sandbox Code Playgroud)

当我student s1( "l1f18bscs0322" , "usama" , { 13,7,1998 }); 在 main 中编写 时,它在我的大学中接受它,我认为是因为它使用 Visual Studio 2013,但是当我使用 Visual Studio 2019 时,它在家里出现错误。它说没有构造函数的实例与参数列表匹配,它采用双倍值引号作为指向常量的指针。将值传递给此构造函数的替代方法是什么?因为即使我将构造函数原型更改为指向指针的常量,它也会给出新的错误,即我无法用常量初始化我的非常量成员。

Ast*_*ngs 7

因为它是!

在 C++ 中,字符串文字的类型是const char[N](其中N是字符串的长度,包括其空终止符)。那衰减到const char*,不是char*

在 C++ 的早期版本(2011 之前)中,您可以“忘记”const与 C 的兼容性,尽管不推荐这样做(并且尝试“修改”文字具有未定义的行为)。从那以后你必须写它。

您已升级到强制执行此规则的 Visual Studio 版本,可能只是因为其默认 C++ 标准是 C++11 或更高版本。

这是一件好事; 添加const.

如果您的课程材料char*在这里使用,那么它已经过时了,并且在某种意义上总是“错误”的。

即使我将构造函数原型更改为指向指针的常量,它也会给出新的错误,即我无法使用常量初始化我的非常量成员

你需要对你的成员变量做同样的事情。

  • 指针不是恒定的,只是“指向数据的点”。您不允许更改“usama”(它存储在 const 存储中) (2认同)