1

私はそれを仮定するのは正しいですか

class D { /* ... */ };

int f (const D & t) { return /* something calculated from t */; }

template<class T>
class C {
private:
    int m_i;
    T m_t;
    // or first m_t, then m_i -- careless order of declarations
public:
    template<class T_>
    C (T_ && t) : m_t (std::forward<T_> (t)), m_i (f (t)) {
    }
};

C<D> c (D ());

が呼び出されtたときに の値が移動されたため、バグが発生する可能性がありますか? (i) ファクトリ関数を使用するか、(ii)とが宣言さf(t)れている順序に依存関係を導入する以外に、この問題を回避する方法はありますか?m_im_t

4

2 に答える 2

3

最初に、初期化子リストの評価の順序はクラス定義のメンバーの順序によって決定されるため、あなたの場合は次のようになります。

template<class T_>
C (T_ && t) 
  : m_i (f (t)), m_t (std::forward<T_> (t)) {
}

だからあなたの場合は大丈夫です。前にm_t宣言され、初期化で使用されるようにメンバーを並べ替えても問題ありません。 m_im_t

T m_t;
int m_i;
template<class T_>
C (T_ && t) 
  : m_t (std::forward<T_> (t)), m_i (f (m_t))  {
}
于 2012-11-24T17:57:56.613 に答える
2

メンバーm_iは最初に初期化され、値が明らかに移動されず、移動されないまでに初期化されます。初期化するときm_t(std::forward<T>(t))、暗黙のうちに s 値を使用しないことを約束しますt(少なくとも、新しい値を指定するまで)。

一般に、実行の順序が重要であり、これはメンバー初期化子リストにも当てはまります。つまり、メンバー間に依存関係を導入するときは、メンバーを宣言する順序に注意する必要があります。

于 2012-11-24T17:58:05.800 に答える