是以下未定义的行为?

bal*_*lki 0 c++ undefined-behavior

以下是内联(定义内部头文件)静态成员函数.文字字符串"MyClass"是否始终保证在静态内存中?如果没有,这不会在堆栈中返回指针吗?

const char * className()
{
return "MyClass";
}
Run Code Online (Sandbox Code Playgroud)

编辑:

这个怎么样?

const RWCString& className()
{
return "MyClass";
}
Run Code Online (Sandbox Code Playgroud)

RWCString是一个字符串类,它有一个隐含的构造函数,它接受一个const char*. http://www.roguewave.com/portals/0/products/sourcepro/docs/11/html/toolsref/rwcstring.html

Mys*_*ial 5

不.这是完全定义的.字符串不在堆栈中.它在全球记忆中.所以它返回的指针是有效的.(甚至更好:你宣布了const)


Mat*_* M. 5

第一个例子:

const char * className()
{
  return "MyClass";
}
Run Code Online (Sandbox Code Playgroud)

很好."MyClass"是一个类型的文字,char const[8]其生命周期在您的代码被调用之前开始,并在您的代码完成之后结束,因此没有问题.

但是,第二个例子不起作用.

const RWCString& className()
{
  return "MyClass";
}
Run Code Online (Sandbox Code Playgroud)

它要求RWCString在函数内构造类型对象,以便能够返回对它的引用.但是,作为局部变量或临时函数构建的内容不能通过引用返回,因此您将获得未定义的行为(如果它编译).

你可以非常简单地把它变成一个"好"的功能:

const RWCString& className()
{
  static RWCString const N = "MyClass";
  return N;
}
Run Code Online (Sandbox Code Playgroud)

在这里,我创建了一个本地静态对象N,它将在第一次调用函数时构造.因为它static的生命周期延伸到调用之后所以可以返回对它的引用.

编辑:正如史蒂夫指出的那样,临时更适合这里的局部变量.