我是正確的假設,初始化列表和std ::向前
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
價值已搬走時f(t)
叫?除了(i)使用工廠功能或(ii)引入對聲明m_i
和m_t
的順序的依賴性之外,是否有任何方法可以避免此問題?
重新排序聲明並使用f(m_t)'有什麼問題?這似乎也是唯一有意義的東西(想想'T'的顯式構造函數)。 –
我認爲它被認爲是不好的風格和容易出錯? – JohnB
好吧,你需要你所需要的。 *如果您願意,編程*很容易出錯。我根本不喜歡這個設計('f'和'T_'之間有什麼奇怪的關係?),但是如果這就是你需要的,你必須這樣做...... –