我见过这个问题。似乎无论演员如何,临时对象都将“存活”直到评估完整表达式。但在以下场景中:
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 个失败了。
@更新
我使用 struct bar 而不是boost::tuple
在原帖中,希望其他人会更熟悉。
让我把我的问题说得更清楚。在 #1 中,double
从int
(2) 创建一个时间,然后bar<const double &>
从它创建 a 并复制到foo
中,而在 #2 中,bar<int>
创建一个时间,并从的 ctor 中double
的成员创建一个时间。似乎时间在#2中被破坏,而在#1中却没有。为什么?我认为它们都是完整表达的一部分,并且会一直存在到返回。bar<int>
bar<const double&>
double
foo
bar
Tim 说:“编译器足够聪明,可以将这个 2 视为 double 而不是 int。”。所以我写信int i = 2;
并传递i
给这两个电话,但事情像以前一样继续。我在 VS2008 中使用调试模式完成了它。