【问题标题】:const object as a data member vs normal variableconst 对象作为数据成员与普通变量
【发布时间】:2022-03-15 20:57:08
【问题描述】:

我试图创建一个 Container 类,它将使用将通过模板传递的类 Comparator 的对象。

所以我正在做类似的事情:

template<typename T>
class Container{
    const T c;
};


struct Comparator{
    public:
    bool operator()(const int a, const int b)const{
        return a < b;
    }
};

int main(){
    Container<Comparator> container;
    return 0;
}

当我尝试编译此代码时,我收到以下错误:

e.cpp:28:27: error: uninitialized const member in 'class Container<Comparator>'
   28 |     Container<Comparator> container;
      |                           ^~~~~~~~~
e.cpp:16:13: note: 'const Comparator Container<Comparator>::c' should be initialized
   16 |     const T c;
      |      

为了摆脱这个错误,我只是在Comparator 类中添加了一个默认构造函数:

struct Comparator{
    public:
    Comparator(){
        
    }
    bool operator()(const int a, const int b)const{
        return a < b;
    }
};

但我观察到的奇怪的事情是,当我将 Comparator 类的 const 对象作为普通变量(不是任何类的数据成员)时,我没有收到任何错误。

struct Comparator{
    public:
    bool operator()(const int a, const int b)const{
        return a < b;
    }
};

int main(){
    const Comparator comp;
    return 0;
}

所以我的问题是,为什么在类中创建 Comparator 类型的 const 对象时会出错,而不是在创建相同类型的普通 const 对象时出错?

【问题讨论】:

  • Container 类中的 Container() : c{} {} 也解决了这个问题。
  • @mch 是的,我也试过了。但我想问的是,为什么我们在创建普通变量时不需要做任何事情,而在类中我们要么需要构造函数,要么像你提到的那样做一些事情?

标签: c++


【解决方案1】:

如果没有为const Comparator 变量指定初始化器,它必须是const-default-constructible。但是你的类 Comparator 是 const-default-constructible 因为它没有非静态数据成员。有关确定的实际规则,请参阅[dlc.init.general]/7

这不仅是对这样一个变量的要求,而且如果一个类有一个没有初始化器的类似非静态成员,则不导致隐式默认构造函数被删除,参见[class.default.ctor]/2.4

所以您的原始代码应该可以编译。 MSVC 会编译它,但 GCC 和 Clang 不会。

但是,对类成员的相关要求已更改为带有缺陷报告的引用措辞:CWG 2394。在此之前,它要求成员具有用户提供的默认构造函数,这是比 const-default-constructible 更强的要求,而这正是您为使其工作而添加的内容。

根据Clang implementation status pageGCC implementation status page,他们的DR 实施状态未知。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2021-05-20
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多