Ale*_*tov 17 c++ standards pointers
以下函数返回的指针是否有效?
const char * bool2str( bool flg )
{
return flg ? "Yes" : "No";
}
Run Code Online (Sandbox Code Playgroud)
它在Visual C++和g ++中运行良好.C++标准对此有何看法?
dir*_*tly 25
关于存储期限:
2.13.4 普通字符串文字和UTF-8字符串文字也称为窄字符串文字.窄字符串文字的类型为"n const char数组",其中n是下面定义的字符串大小,并且具有静态存储持续时间
与3.7.1一起阅读
3.7.1.
所有没有动态存储持续时间,没有线程存储持续时间且不是本地的对象都有静态存储持续时间.这些对象的存储应持续到程序的持续时间(3.6.2,3.6.3).
在类型上:
附件C.
第2.13.4款:
更改:字符串文字使const const字符串文字的类型从"char of char"更改为"const char数组."char16_t字符串文字的类型从"some-integer-type"数组更改为"array" const char16_t."char32_t字符串文字的类型从"some-integer-type数组"更改为"const char32_- t数组."宽字符串文字的类型从"wchar_t数组"更改为"const wchar_t数组."
基本原理:这可以避免调用不适当的重载函数,该函数可能希望能够修改其参数.
对原始特征的影响:改变定义明确的特征的语义.转换难度:简单的句法转换,因为字符串文字可以转换为char*; (4.2).最常见的情况是由一个新的但已弃用的标准转换处理:char*p ="abc"; //在C中有效,在C++中不推荐使用char*q = expr?"abc":"de"; //在C中有效,在C++中无效
使用的广泛程度:有合理理由将字符串文字视为可能可修改内存的指针的程序可能很少见.
动态分配(单词'heap'从未在标准中的内存AFAIK区域的上下文中使用)内存需要一个函数调用,该函数调用可以main在分配静态内存之后很早发生.
JSB*_*ոգչ 13
此代码完全有效且符合要求.唯一的"问题"是确保调用者不会尝试释放字符串.
Kea*_*eks 12
此代码有效且符合标准.
字符串文字存储在只读存储器中,该函数只获取所选字符串的地址.
C++标准(2.13.4)说:
普通的字符串文字具有类型"n const char数组"和静态存储持续时间
它们是解决您的问题的关键,是静态存储持续时间:在程序启动时分配字符串文字,并在程序持续时间内持续.您的函数只获取地址并返回它.
技术上是的它是有效的.
琴弦有静态存储装置.
但这不是全部.
这些是C-Strings.C-Library和函数中的约定是返回应该被释放的动态分配的字符串.即返回的指针隐式将所有权传递回调用者(因为在C中也有例外).
如果你不遵循这些约定,你会混淆那些期望这个约定的经验丰富的C开发人员.如果您不遵循此标准期望,则应在代码中详细记录.
这也是C++(根据你的标签).因此返回std :: string更为常规.这样做的原因是只通过指针传递所有权(这导致C代码中的许多错误,上述期望被打破但记录在案,遗憾的是文档从未被代码用户读取).通过使用std :: string,你传递一个对象,它们不再是所有权的问题(结果作为一个值传递回来,因此你的传递回来),但因为它是一个对象,所以没有资源分配的问题或问题.
如果你担心效率,我认为这是一个虚假的问题.
如果您希望通过流进行打印,那么已经有了一个标准惯例:
std::cout << std::boolalpha << false << std::endl;
std::cout << std::boolalpha << true << std::endl;
Run Code Online (Sandbox Code Playgroud)