C++ 初始化和分配

C++ 初始化和分配,c++,initialization,variable-assignment,C++,Initialization,Variable Assignment,我有一些“遗留”代码(我无法更改,但需要添加到其中),看起来像这样: template<typename T> T Foo(T& target) { //Assign to 'target', but never read from it before that. //Also, 'target' is going to be a POD-type. target = T(); return target; } int main() {

我有一些“遗留”代码(我无法更改,但需要添加到其中),看起来像这样:

template<typename T> T Foo(T& target)
{
    //Assign to 'target', but never read from it before that.
    //Also, 'target' is going to be a POD-type.

    target = T();

    return target;
}

int main()
{
    float value = Foo(value);
}
模板T Foo(T&target)
{
//分配给“目标”,但在此之前从未从中读取。
//此外,“目标”将是一个吊舱类型。
target=T();
回报目标;
}
int main()
{
浮动值=Foo(值);
}

这让人感觉不安全(即确保在使用前从未分配目标),这种接口是否存在其他潜在致命问题?

。。如果您执行以下代码:

T value;
然后,该值将得到对其调用的构造函数。老实说,这个模板看起来就像构造函数被调用了两次

而且,如果T只是简单的旧数据,那么就不会出现致命的问题


你到底担心发生什么事?

嗯。。如果您执行以下代码:

T value;
然后,该值将得到对其调用的构造函数。老实说,这个模板看起来就像构造函数被调用了两次

而且,如果T只是简单的旧数据,那么就不会出现致命的问题


你到底担心发生什么?

好吧,当输入Foo的作用域时,target(也称为main中的value)没有正确初始化;如果在分配有意义的内容之前意外地在Foo中读取它,则可能会导致问题。嗯,我真的不知道在那个时候构造函数是否会被调用。。。对于普通的旧数据,我不会太担心,因为您将保留堆栈空间。我能想到的最糟糕的情况是,你会在那里胡说八道。事实上,我只是用gcc试过了,在那一点上还没有调用构造函数。事实上这很酷。最坏的情况是,您访问的数据是非斜体的。不过,对于POD类型,您不会出现seg故障或类似的故障。这不应该发生。不管内存是如何布局的,您只是在访问堆栈上或寄存器中的内存。仅仅因为构造函数没有被调用并不意味着内存没有被分配(如果它是堆栈空间,它应该在编译时被分配)。好的,当输入Foo的作用域时,目标(也称为main中的值)没有正确初始化;如果在分配有意义的内容之前意外地在Foo中读取它,则可能会导致问题。嗯,我真的不知道在那个时候构造函数是否会被调用。。。对于普通的旧数据,我不会太担心,因为您将保留堆栈空间。我能想到的最糟糕的情况是,你会在那里胡说八道。事实上,我只是用gcc试过了,在那一点上还没有调用构造函数。事实上这很酷。最坏的情况是,您访问的数据是非斜体的。不过,对于POD类型,您不会出现seg故障或类似的故障。这不应该发生。不管内存是如何布局的,您只是在访问堆栈上或寄存器中的内存。仅仅因为构造函数没有被调用并不意味着内存没有被分配(如果它是堆栈空间,它应该在编译时被分配),我同意它“感觉”不安全,我在标准中找不到任何解决这个问题的方法。这样做有什么好的理由吗?如果不是,我通常会建议你改变它,但你说你不能,所以我怀疑这只是一个学会接受它的案例(我同意它“感觉”不安全,我在标准中找不到解决这个问题的任何东西。这样做有什么好的理由吗?如果没有,我通常会建议你改变它,但你说你不能,所以我怀疑这只是一个学着接受它的案例。)(