【发布时间】:2015-07-28 20:48:06
【问题描述】:
我想知道当我在函数中定义一个 constexpr 变量时,内部会发生什么。程序是否存储了被调用函数的 constexpr 变量的每个版本?
例子:
template <class T, std::size_t M, std::size_t N>
template <std::size_t M2, std::size_t N2>
Matrix<T, M, N>::Matrix(const Matrix<T, M2, N2>& m)
{
constexpr T m_min(MATHS::min(M, M2));
constexpr T n_min(MATHS::min(N, N2));
std::size_t i(0), j(0);
for ( ; i < m_min ; ++i )
{
for ( j = 0 ; j < n_min ; ++j )
m_elts[i][j] = m.m_elts[i][j];
for ( ; j < N ; ++j )
m_elts[i][j] = MATHS::CST<T>::ZERO;
}
for ( ; i < M ; ++i )
{
for ( j = 0 ; j < N ; ++j )
m_elts[i][j] = MATHS::CST<T>::ZERO;
}
}
//m_elts is : std::array<std::array<T, N>, M> m_elts;
【问题讨论】:
-
视情况而定。可能需要为每个 constexpr 对象创建唯一地址。在某些时候甚至可以定义一个带有可变数据成员的 constexpr 结构,但我认为有一个针对此类事物的缺陷报告。
-
提供具体的代码示例以获得更好的答案。正如@dyp 所说,这取决于 constexpr 变量的定义和使用方式。
-
很好的跟进,我希望我有一个很好的答案给你。
-
这个问题:Understanding the example on lvalue-to-rvalue conversion 是一个极端的例子,但给出了一个很好的例子,结果有点出乎意料。
-
我撤回了我的近距离投票,因为这个例子让问题很清楚,尽管我仍然认为 MCVE 会更好。