当前位置: 首页 > 知识库问答 >
问题:

使用方法更改 constexpr 对象成员失败

简宏义
2023-03-14

我试图通过一个方法更改constexpr对象成员的值,但我不明白为什么它在这种特定情况下不起作用:

#include <iostream>

struct test
{
    int m_counter = 0;

    constexpr test()
    {
        m_counter++;
        m_counter++;
        increment();
        increment();
        increment();
    }

    constexpr void increment()
    {
        m_counter++;   
    }

    constexpr int value() const
    {
        return m_counter;
    }
};

template<int value>
constexpr void check()
{
    std::cout << value << std::endl;
}

// constexpr test t; // value = 3, why ?

int main()
{
    constexpr test t; // value = 5, ok
    check<t.value()>();
}

当我在全局范围内创建对象时,我不明白为什么值是3。msvc和clang在两种情况下都显示5,但不显示gcc。谁错了?

共有1个答案

郑帅
2023-03-14

这好像是g的bug,从g 5.1一直到g 7.0都可以重现。我认为这是一个错误,因为这种行为似乎是荒谬的。我摆弄了一下代码片段,我相信如果变量是全局的,编译器只执行第一个< code>increment()调用,而忽略其他调用:

constexpr test()
{
    m_counter++; // executed
    m_counter++; // executed
    increment(); // executed
    increment(); // NOT executed
    increment(); // NOT executed
}

// [...] will print 3
constexpr test()
{
    m_counter++; // executed
    m_counter++; // executed
    increment(); // executed
}

// [...] will print 3
constexpr test()
{
    m_counter++; // executed
    m_counter++; // executed
}

// [...] will print 2
constexpr test()
{
    m_counter++; // executed
    m_counter++; // executed
    increment(); // executed
    increment(); // NOT executed
    increment(); // NOT executed
    increment(); // NOT executed
    increment(); // NOT executed
    increment(); // NOT executed
}

// [...] will print 3

基本上,只会执行构造函数内部的一个<code>increment()</code>。添加更多increment()调用没有效果。然而,添加更多m_counter指令将正常工作。

constexpr test()
{
    m_counter++; // executed 
    m_counter++; // executed
    increment(); // executed
    increment(); // NOT executed
    m_counter++; // executed
    m_counter++; // executed
    increment(); // NOT executed
    increment(); // NOT executed
}

// [...] will print 5

我在 g 错误跟踪器上将此报告为错误 #80039。

 类似资料:
  • 我正在尝试使用 更改 联盟的活动成员,并在构造函数使用初始值设定项列表与成员初始化其成员时出现以下错误。有人可以解释为什么吗? 错误:

  • 我想出了这个类: 这里是用法: 问题: 为什么使用作为返回表达式编译得很好(Z不是instexpr)。 如何调用和方法的对象() ? 中的行为在编译器中是不同的。MSVC可以使用作为模板参数进行编译,而GCC(IdeOne)不会编译它。 对于一个编译器来说< code>constexpr GetX是真正的< code>constexpr,但是对于另一个编译器来说,如果涉及到< code>X Z就不

  • 在C 14中,由于<code>constexpr</code>不再是隐式<code>常量</code<,所以<code>constexpr<-code>成员函数是否可以修改类的数据成员:

  • 问题内容: 我有一个像这样的功能: 在功能结束时, elemR 被更改,但是从main方法调用函数后,参数 elemR 仍具有与函数调用之前相同的值。有什么问题?如何在调用函数后更改此ListElement并“保存”此更改,而无需将返回类型更改为ListElement(我也需要整数返回值)? 问题答案: Java函数参数通过引用名称进行调用,这意味着当您将一个对象作为函数参数放置时,JVM将引用的

  • 本文向大家介绍JavaScript更改原始对象valueOf的方法,包括了JavaScript更改原始对象valueOf的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript更改原始对象valueOf的方法。分享给大家供大家参考。具体分析如下: JS中的对象都包含valueOf方法,我们可以通过自定义valueOf函数替换掉原始object的valueOf 希望本文所述

  • 此代码编译: 该代码不: 报告的错误(在 MSVC、gcc 和 clang 中)表明他们认为 构造函数未定义或不是 ,例如。从叮叮当当: 为什么? (可能与这个问题有关,但在使用时应该是完整的;只有仍然不完整。