// 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;
}
答案 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 ++中的内存分配和内存初始化是如何工作的?
我自己并不是专家,但这是我对这个概念的理解:
这意味着什么: 是的,您应该能够使用内存,但不要信任数据
根据您的观点,您似乎希望“接收”#34;来自函数的数据,而没有它&#34;返回它&#34;如果函数本身并不关心数据,那么这种处理变量的方法就完全没问题了。 (根据我的理解)
验证&#34;轨道轻盈竞赛&#34;答案
答案 2 :(得分:-2)
必须始终初始化参考变量,并始终有效。如果要引用可能无效/未初始化的内存,请改用指针参数(T*
)。
你可以像使用T
类型的任何变量一样使用你的参数,&
唯一可以改变它的初始化方式,这是在调用函数时完成的,并且将初始化它以引用一些左值表达式。
由于v
已经初始化,你无法重新初始化它(你可以尝试new(&v) T()
,但除非你为v
调用析构函数,否则我不会建议,(例如, v.T::~T()
)。(注意:v = T();
没有(重新)初始化v
,它会复制分配。)
至于使用它作为临时缓冲区,请不要使用指针。 (虽然我认为使用T& v
作为缓冲区是有效的,并且它会按预期工作,如果你试图存储错误时间的对象,它可能会混淆编译器,