以下代码显示了如何使用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
}
答案 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;
}