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

Gam*_*Gam -1 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);
Run Code Online (Sandbox Code Playgroud)

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

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

v = T();
v.something();  // if T is a class
Run Code Online (Sandbox Code Playgroud)

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

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

Lig*_*ica 5

以下是Mike Seymour对之前类似问题的回答被盗(略有修改).


在里面bind,value1已声明,因此名称可供使用:

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

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

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

所以,你正在做的事情是明确定义的.

(尽管是超级的,我认为在分配自动对象的存储时没有指定,并且8.3.2/5表示"引用应该被初始化以引用有效对象"而不定义"有效",所以有可能争论它没有明确定义).