4

ildjarnからのこの回答を読んだ後、次の例を書きました。名前のない一時オブジェクトは、その参照と同じ寿命を持っているようです!

  • なぜこれが可能ですか?
  • C++ 標準で指定されていますか?
  • どのバージョン?

ソースコード:

#include <iostream>  //cout
#include <sstream>   //ostringstream 

int main ()
{
        std::ostringstream oss;
        oss << 1234;

        std::string const& str = oss.str();
        char        const* ptr = str.c_str();

        // Change the stream content
        oss << "_more_stuff_";
        oss.str(""); //reset
        oss << "Beginning";
        std::cout << oss.str() <<'\n';

        // Fill the call stack
        // ... create many local variables, call functions...

        // Change again the stream content
        oss << "Again";
        oss.str(""); //reset
        oss << "Next should be '1234': ";
        std::cout << oss.str() <<'\n';

        // Check if the ptr is still unchanged
        std::cout << ptr << std::endl;
}

実行:

> g++ --version
g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> g++ main.cpp -O3
> ./a.out
Beginning
Next should be '1234':
1234
4

3 に答える 3

10

なぜこれが可能ですか?

標準がそう言っているからです。右辺値参照とconst左辺値参照は、一時変数の有効期間を延長します。

[C++11: 12.2/5]: [..]参照がバインドされている一時オブジェクト、または参照がバインドされているサブオブジェクトの完全なオブジェクトである一時オブジェクトは、[..]を除いて、参照の存続期間中存続します。

また、徹底的な表現では、一時変数を左辺値以外の参照[C++11: 8.5.3/5]にバインドしてはならないことが要求されます。const


C++ 標準で指定されていますか? どのバージョン?

はい。それらのすべて。

于 2013-03-07T09:42:34.287 に答える
6
于 2013-03-07T09:42:31.853 に答える
3

オービットのライトネスレースは正しいです。そして、この例はより簡潔になると思います。

#include <iostream>  //cout
#include <string>

int main ()
{
    using namespace std;
    int a = 123;
    int b = 123;
//  int       & a_b = a + b; // error!
    int const & a_b = a + b;
    cout<<"hello world!"<<endl;
    cout<<a_b<<endl;
}
于 2013-03-07T10:30:37.763 に答える