是否有任何constexpr运算符的应用程序++(int)(后增量)

时间:2017-04-24 16:04:06

标签: c++ c++14 constexpr

以下代码显示了如何使用constexpr operator++()(预增量)(live demo)。现在我想知道将后增量运算符声明为constexpr是否有用。我假设这样的操作符没有副作用,并且以与示例中类似的方式使用。 (如果这太抽象了:我打算扩展我的bitset2类,并想知道如果后增量运算符是constexpr,是否会有任何好处。)

struct S {
  constexpr S( int i ) : m_i( i ) {}
  constexpr S & operator++() {
      ++m_i;
      return *this;
  }
  int m_i;
};

int main() {
  constexpr auto s1= ++S{3};  
  std::cout << s1.m_i << '\n'; // output: 4
}

2 个答案:

答案 0 :(得分:2)

是的,它有一个应用程序:定义后增量运算符对于编写constexpr函数很有用。请考虑以下事项:

tempalte<std::size_t N>
constexpr std::array<baz,N> foo(){
    std::array<baz,N> bar;
    baz i;
    for(auto&& item: bar) {
        item = i++;
    }
    return bar;
}

上面示例中的数组bar将在编译时通过constexpr填充。假设类型baz是某种形式的计数器,增量的操作顺序(前/后)可能很重要。

要记住的是,constexpr不仅仅是一个表达式。允许进入constexpr的复杂(当然是constexpr的规则)计算。从理论上讲,你可以完全用constexpr编写许多程序(虽然我不是说这是一个好主意)。

答案 1 :(得分:0)

我不知道它是否有用,但您可以在后增量中复制前增量示例

可编辑的例子

#include <iostream>

struct S
 {
   constexpr S (int i) : m_i{ i }
    { }

   constexpr S & operator++ ()
    {
      ++m_i;
      return *this;
    }

   constexpr S operator++ (int)
    {
      S ret { this->m_i ++ };
      return ret;
    }

   int m_i;
 };

int main()
 {
   constexpr S s1 { ++S{3} };  
   constexpr S s2 { S{4}++ };  

   static_assert( s1.m_i == s2.m_i, "!");
 }

使用constexpr运算符,您可以将constexpr函数编写为

constexpr S foo (int a, int b)
 {
   S s1 { a };
   S s2 { b };

   bool test { (s1++).m_i == (++s2).m_i };

   return test ? s1 : s2;
 }