// 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)
以下是Mike Seymour对之前类似问题的回答被盗(略有修改).
在里面bind,value1已声明,因此名称可供使用:
[C++11: 3.3.2/1]:声明的声明就在其完整的声明者(第8条)之后和初始化之前
您可以在初始化之前以有限的方式使用对象.基本上,任何不依赖于价值的东西都可以:
[C++11: 3.8/6]:在对象的生命周期开始之前,但在对象占用的存储空间被分配之后,任何引用原始对象的glvalue都可以使用,但只能以有限的方式使用.[...]使用不依赖于其值的glvalue的属性是明确定义的.
所以,你正在做的事情是明确定义的.
(尽管是超级的,我认为在分配自动对象的存储时没有指定,并且8.3.2/5表示"引用应该被初始化以引用有效对象"而不定义"有效",所以有可能争论它没有明确定义).