私はこの質問を見ました。キャストに関係なく、一時オブジェクトは完全な式が評価されるまで「存続」するようです。しかし、次のシナリオでは:
template<class T>
struct bar {
T t;
bar(T t) : t(t) {}
template<class U>
bar(bar<U> other) : t(other.t) {}
};
void foo(bar<const double&> b) {
printf("%lf\n", b.t);
}
int main() {
foo(bar<const double&>(2));//#1
foo(bar<int>(2)); //#2
return 0;
}
1つはうまく動作しますが、2つはそうではありません。そしてMSVCは私に2についての警告を与えました:「参照メンバーはコンストラクターが終了した後に持続しない一時的なものに初期化されます」
今、私はなぜ彼らが一時double
オブジェクトを作成してそれを渡すのか疑問に思っていますがbar<const double&>
、2つだけが失敗しました。
@アップデート
元の投稿の代わりに構造体バーを使用boost::tuple
しています。他の人に親しまれていることを願っています。
私の質問をもっと明確にしましょう。#1では、(2)double
からテンポラルが作成され、そこからaが作成されて、にコピーされます。#2では、テンポラルが作成され、のctorのメンバーからテンポラルが作成されます。#1ではなく#2でテンポラルが破壊されているようです。なんで?それらはすべて完全な表現の一部であり、戻るまで存在するはずだと思います。int
bar<const double &>
foo
bar<int>
double
bar<int>
bar<const double&>
double
foo
bar
ティムは、「コンパイラは、この2をintではなくdoubleとして扱うのに十分賢い」と述べています。だから私は2つの呼び出しの両方に書き込みint i = 2;
、パスi
しましたが、物事は以前と同じように進行します。VS2008でデバッグモードで作成しました。