在初始化之前使用局部变量

时间:2016-04-28 17:58:30

标签: c++

// bind function: 
template<typename T> T bind(T& v) 
{   
    // Can I toy with the object v refers to? or that's undefined behaviour?
    // the object v refers to is not initialized yet, But the object has been allocated, so I can use that memory, I think?

    // The following 2 lines should be fine if I'm correct.
    // Which is my function is currently is doing (sorta)
    myvector.emplace_back(SQLType<T>(), (void*)&v);
    return 0;
}

SomeClass value = bind(value);

我想知道在初始化之前我是否可以使用对象value(这会在bind函数返回时发生)。

1 - 我可以自己初始化对象并使用它吗?即:

v = T();
v.something();  // if T is a class

2 - 或者我可以使用存储它的内存吗?即:作为临时原始缓冲区?

if (sizeof(v) > 4)
{
     ((char*)&v)[0] = 1;
     ((char*)&v)[1] = e + 5;       
}

3 个答案:

答案 0 :(得分:5)

以下内容从Mike Seymour's answer to a previous, similar question被盗(略有修改)。

bind内,value1已声明,因此名称可供使用:

  

[C++11: 3.3.2/1]:名称的声明点紧跟在其完整的声明者(第8条)之后和初始化者之前

在初始化之前,您可以以有限的方式使用对象。基本上,任何不依赖于价值的东西都可以:

  

[C++11: 3.8/6]:在对象的生命周期开始之前但在对象占用的存储空间被分配之后,任何引用原始对象的glvalue都可以使用,但只能以有限的方式使用。 [...]使用不依赖于其值的glvalue的属性是明确定义的。

所以,你所做的事情是明确的。

(虽然,当你分配自动对象的存储时,我并不认为它是超级的,并且8.3.2 / 5说&#34;引用应该被初始化为引用一个有效的对象&#34;没有定义&#34;有效的&#34;,因此可以说明它没有明确定义。

答案 1 :(得分:0)

我看到的,你的问题是,c ++中的内存分配和内存初始化是如何工作的?

我自己并不是专家,但这是我对这个概念的理解:

  • 如果变量是基本类型,它将被分配但不会被初始化。
  • 如果变量是一个对象,则总是执行一个构造函数(默认情况下,如果没有使用else),因此分配了内存并且可以初始化(取决于构造函数)

这意味着什么: 是的,您应该能够使用内存,但不要信任数据

根据您的观点,您似乎希望“接收”#34;来自函数的数据,而没有它&#34;返回它&#34;如果函数本身并不关心数据,那么这种处理变量的方法就完全没问题了。 (根据我的理解)

验证&#34;轨道轻盈竞赛&#34;答案

答案 2 :(得分:-2)

必须始终初始化参考变量,并始终有效。如果要引用可能无效/未初始化的内存,请改用指针参数(T*)。

你可以像使用T类型的任何变量一样使用你的参数,&唯一可以改变它的初始化方式,这是在调用函数时完成的,并且将初始化它以引用一些左值表达式。 由于v已经初始化,你无法重新初始化它(你可以尝试new(&v) T(),但除非你为v调用析构函数,否则我不会建议,(例如, v.T::~T())。(注意:v = T();没有(重新)初始化v,它会复制分配。)

至于使用它作为临时缓冲区,请不要使用指针。 (虽然我认为使用T& v作为缓冲区是有效的,并且它会按预期工作,如果你试图存储错误时间的对象,它可能会混淆编译器,