このコードを VS2010 で実行すると、次のような警告が表示されますが、コンソールに C 文字列 "f()" と "g()" が出力されます。
質問 1: f() では警告が生成され、g() では生成されないのはなぜですか? プログラムが終了するまで、文字列リテラルは静的メモリに保持されませんか?
質問 2: main() で h() の呼び出しをコメント アウトすると、コードがクラッシュします。なぜ異なる動作ですか?
#include<iostream>
const char* const& f()
{
return "f()"; // warning C4172: returning address of local variable or temporary
}
const char* g()
{
return "g()"; // no warning
}
const std::string& h()
{
return "h()"; // warning C4172:
}
int main()
{
std::cout << f() << '\n';
std::cout << g() << '\n';
// std::cout << h().c_str() << '\n'; // comment out and program crashes
}