我很难理解cppreference引用的有关普通默认构造函数的以下段落。我已经搜索了stackoverflow,但仍然没有一个明确的答案。所以请帮忙。
普通的默认构造函数是不执行任何操作的构造函数。与C语言兼容的所有数据类型(POD类型)都是默认可构造的。但是,与C语言不同,不能通过简单地重新解释适当对齐的存储来创建具有琐碎默认构造函数的对象,例如,用std :: malloc分配的内存:正式引入新对象并避免潜在的未定义行为时,需要placement-new。
具体来说,如果琐碎的默认构造函数什么都不做,为什么我们不能重新解释存储并假装存在具有给定类型的对象?您能否提供一些可能导致未定义行为的示例?
编译器最重要的工作不是编译源代码,而是拒绝可能无效的代码。当您使用malloc()时,它无法做到这一点。
—
汉斯·帕桑
原因很简单。程序员做疯狂事情的机会越少,编译器做疯狂事情的机会就越多(积极的优化)。
—
n。代词
由于类似的原因,你不能只是
—
Max Langhof
*reinterpret_cast<float*>(&someNonFloatObject) = 0.1f;
。C ++具有在抽象机上指定的对象和对象生存期的概念,并且仅仅因为没有CPU指令可以从存储中创建对象,并不意味着抽象机上没有任何区别。
@HansPassant拒绝所有代码的编译器将拒绝所有无效代码。无论如何,拒绝具有UB的程序不是编译器的工作。
—
n。代词