小编0kc*_*ats的帖子

C++ 类可以有多个隐式默认构造函数吗?

我在 C++ 行为中发现了一个令我困惑的有趣案例。预先警告,我不会在自己的代码中执行此操作。这只是为了了解标准。

这里我有一个没有显式默认构造函数的类 M。它继承自具有显式默认构造函数的类 Base。当我像 M() 或 M{} 那样构造 M 类时,它将把成员 r 归零。如果我在没有任何括号的情况下构造它,则不会初始化成员 r,但会调用基类构造函数(如预期)。对我来说奇怪的是,这种行为似乎 M 类现在有两个隐式默认构造函数 - 一个使成员 r 未初始化,但调用所有继承的构造函数,另一个将其清零。

如果 M 是纯 POD,那么我理解这种行为(默认初始化与统一化),但这里甚至添加 M() = default; 仍然会导致它与 new M() 和 new M 的行为不同。

因为两个编译器执行相同的操作,所以看起来不像是错误,但是这个功能是什么?这有点令人困惑。有没有一个简化的方案来理解它。

这是代码的 godbolt 链接https://godbolt.org/z/9srh48Y5Y 我在这里做一些技巧来强制将类分配在一些垃圾填充的内存上,以便在 godbolt 上看到该行为。

#include <iostream>
#include <cstring>

//Base class with default constructor
//explicitly defined
class Base
{
public:
  int k;
  Base() : k(0xF){}
};

//A class with default constructor
//explicitly defined
class C
{
public:
  int z;
  C() : z(13){} …
Run Code Online (Sandbox Code Playgroud)

c++

4
推荐指数
1
解决办法
160
查看次数

有没有一种方法可以构造一个constexpr函数来获取double的位表示形式?

是否有构造constexpr函数的标准方法,该函数允许将double转换为其64位表示形式:

constexpr uint64_t double_to_uint64_t(double d) {
   ??????
}
Run Code Online (Sandbox Code Playgroud)

以便

constexpr uint64_t two_bits = double_to_uint64_t(2.0);
Run Code Online (Sandbox Code Playgroud)

会编译吗?

反向方法(uint64变为double)也很有趣。

c++ constexpr c++11

1
推荐指数
1
解决办法
71
查看次数

标签 统计

c++ ×2

c++11 ×1

constexpr ×1