为什么 new visual studio 将字符串文字作为指向常量的指针?
Why new visual studio take string literals as pointer to constant?
我的 class 学生有这个构造函数。
student::student( char* rollno , char* name , date dob) :
rollno(rollno), name(name),dob(dob)
{
}
当我写作时
student s1( "l1f18bscs0322" , "usama" , { 13,7,1998 });
主要是,它在我的大学接受它,我认为是因为它使用 Visual studio 2013,但它给出了错误
在家里,因为我正在使用 visual studio 2019。它说没有构造函数的实例与参数列表匹配,它将双引号中的值作为指向常量的指针。将值传递给此构造函数的替代方法是什么?因为即使我将构造函数原型更改为指针常量,它也会给出新的错误,即我无法使用常量初始化非常量成员。
因为它是!
在 C++ 中,字符串文字的类型是 const char[N]
(其中 N
是字符串的长度,包括其空终止符)。衰减到 const char*
,而不是 char*
。
在 C++ 的早期版本(2011 年之前)中,为了与 C 兼容,您被允许“忘记”const
,尽管这样做已被弃用(并且试图“修改”未定义的文字行为)。从那以后你必须写它。
您已升级到 a version of Visual Studio that enforces this rule,可能只是因为它的默认 C++ 标准是 C++11 或更高版本。
这是一件好事;添加 const
.
如果您的课程 material 在此处使用 char*
,则它已经过时,并且 始终 在某种意义上是“错误的”。
even If I change my constructor protype to constant to pointer so it will give new error that I cannot initialize my non constant members with constant
你需要对你的成员变量做同样的事情。
我的 class 学生有这个构造函数。
student::student( char* rollno , char* name , date dob) :
rollno(rollno), name(name),dob(dob)
{
}
当我写作时
student s1( "l1f18bscs0322" , "usama" , { 13,7,1998 });
主要是,它在我的大学接受它,我认为是因为它使用 Visual studio 2013,但它给出了错误
在家里,因为我正在使用 visual studio 2019。它说没有构造函数的实例与参数列表匹配,它将双引号中的值作为指向常量的指针。将值传递给此构造函数的替代方法是什么?因为即使我将构造函数原型更改为指针常量,它也会给出新的错误,即我无法使用常量初始化非常量成员。
因为它是!
在 C++ 中,字符串文字的类型是 const char[N]
(其中 N
是字符串的长度,包括其空终止符)。衰减到 const char*
,而不是 char*
。
在 C++ 的早期版本(2011 年之前)中,为了与 C 兼容,您被允许“忘记”const
,尽管这样做已被弃用(并且试图“修改”未定义的文字行为)。从那以后你必须写它。
您已升级到 a version of Visual Studio that enforces this rule,可能只是因为它的默认 C++ 标准是 C++11 或更高版本。
这是一件好事;添加 const
.
如果您的课程 material 在此处使用 char*
,则它已经过时,并且 始终 在某种意义上是“错误的”。
even If I change my constructor protype to constant to pointer so it will give new error that I cannot initialize my non constant members with constant
你需要对你的成员变量做同样的事情。