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

Posted

技术标签:

【中文标题】为啥新的 Visual Studio 将字符串文字作为指向常量的指针?【英文标题】:Why new visual studio take string literals as pointer to constant?为什么新的 Visual Studio 将字符串文字作为指向常量的指针? 【发布时间】:2020-11-30 15:42:09 【问题描述】:

我的班级学生有这个构造函数。

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++ 中的常量字符数组。这是 C++ 标准本身。旧版本的 MSVC++ 编译器可能对允许它的语言进行了不可移植的扩展。 您不能将字符串文字(如“usama”)转换为char*。你需要一个const char* 因为它一直是一个,所以现在MSVC遵循当前的c++标准。 相关:What is the type of string literals in C and C++? @Someprogrammerdude 在 C++11 之前,只弃用了转换。该标准有一个允许这种转换的例外,我猜是为了与 C 兼容。 【参考方案1】:

因为它是!

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

在 C++ 的早期版本(2011 年之前)中,您被允许“忘记”const 以与 C 兼容,尽管这样做已被弃用(并试图“修改”文字具有未定义的行为)。从那时起,您必须编写它。

您已升级到 a version of Visual Studio that enforces this rule,可能只是因为它的默认 C++ 标准是 C++11 或更高版本。

这是一件好事;添加const

如果您的课程资料在此处使用char*,则说明它已过时,并且在某种意义上总是“错误”。

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

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

【讨论】:

但是如果我不希望我的成员是一个常数,我希望他们的值可以在以后改变呢? @UsamaJaved 然后你需要它们不是指向字符串文字的指针。如果您的课程允许,std::string 将是理想的。如果做不到这一点,就会出现老式的strdupfree(但糟糕!)。话虽如此,您似乎不太可能真的想修改这些字符串的单个字符,并且可能稍后可以将 不同的 字符串文字分配给指针?我们目前对您的目标和要求了解不够,无法提出进一步的具体建议。 @UsamaJaved,然后复制输入并存储副本。 指针不是常量,只是“指向数据”。您不允许更改“usama”(它存储在 const 存储中) 知道了,谢谢大家。

以上是关于为啥新的 Visual Studio 将字符串文字作为指向常量的指针?的主要内容,如果未能解决你的问题,请参考以下文章

为啥按值传递 string_view?为啥 Visual Studio 不能对此进行优化?

为啥Visual Studio在声明字符串数组列表时会抛出异常

关于在Visual Studio2010中如何卸载Visual Asixist这个插件?为啥将它卸载后Visual Studio启动后仍然有

为啥从 Visual Studio 2008 中删除了在新 ATL 项目中使用属性的选项?

为啥visual+studio+code里面用c语言写的printf输出中终端显示问号?

c#在visual studio开发环境下设计一个闹钟 小界面程序