4

私には、すべてを「const」値として返す習慣(?!?!?)があります。このような...

struct s;

s const make_s();

s const &s0 = make_s();
s const s1 = make_s();

移動操作とr値参照および次の関数を使用して...

void take_s(s &&s0);
void take_s(s const &&s0);  //  Doesn't make sense

もう書けない…

take_s(make_s());

const値を返す規則を使い始めた主な理由は、誰かがこのようなコードを記述できないようにするためです...

make_s().mutating_member_function();

ユースケースは次のとおりです...

struct c_str_proxy {
    std::string m_s;

    c_str_proxy(std::string &&s) : m_s(std::move(s)) {
    }
};

c_str_proxy c_str(std::string &&s) {
    return c_str_proxy(s);
}

char const * const c_str(std::string const &s) {
    return s.c_str();
}

std::vector < std::string > const &v = make_v();
std::puts(c_str(boost::join(v, ", ")));

std::string const my_join(std::vector < std::string > const &v, char const *sep);

//  THE FOLLOWING WORKS, BUT I THINK THAT IS ACCIDENTAL
//  IT CALLS
//
//      c_str(std::string const &);
//
//  BUT I THINK THE TEMPORARY RETURNED BY
//
//      my_join(v, "; ")
//
//  IS NO LONGER ALIVE BY THE TIME WE ARE INSIDE
//
//      std::puts
//
//  AS WE ARE TAKING THE "c_str()" OF A TEMPORARY "std::string"
//
std::puts(c_str(my_join(v, "; ")));

この特定のユースケースでは、「const値を返す」とr値の参照が混在していないように見えます。そうですか?

**Edit 0: Extra question...**

オブジェクトはとにかく一時的です。なぜ「const」は移動を防ぐ必要があるのですか?なぜ「一定の」一時的なものを移動できないのですか?

4

3 に答える 3

14

あなたには2つの相反する目標があります。一方では、返されたオブジェクトに変更が加えられないようにする必要がありますが、他方では、変更を許可する必要があります(これが移動操作です。内部リソースを盗むことにより、ソースオブジェクトを変更します。)。

あなたは決心する必要があります。オブジェクトを不変にしたいですか、それとも他の人がオブジェクトを変更できるようにしたいですか?

そもそも一時的なものを返すことで何が得られるのか、私にはわかりません。はい、あなたは人々がその上で変異メンバー関数を呼び出すことを防ぎます、しかしなぜあなたはそうしたいのですか?せいぜい、そうすることができることは役に立つかもしれません、そして最悪の場合、それは簡単に避けられる間違いです。

そして、あなたがしていることはあまり意味がありません。一時的なものの全体的なポイントは、それがすぐになくなるということです、それで、それが変更されるかどうか誰が気にしますか?

右辺値参照と移動セマンティクスの背後にある全体的な考え方は、一時的なものは一時的なものであるため、誰にも害を与えることなく変更できるということです。

于 2011-08-21T14:51:41.090 に答える
1

ローカル変数がスコープ外になるという問題が実際に発生する可能性があります。

c_str()内部バッファへのポインタを返すため、元の変数がスコープ外になると、ポインタは無効になります。

于 2011-08-21T14:28:00.890 に答える
-3

戻り値のconst修飾子には意味的な意味はありません。コンパイラで警告レベルを上げると、これを行うたびに警告が発行されます。

于 2011-08-21T14:51:50.683 に答える