【发布时间】:2017-03-06 19:49:45
【问题描述】:
以下代码:
#include<iostream>
#include<array>
using std::size_t;
using std::array;
//#define INIT_BY_HAND 1
#define CONSTEXPR 1
#ifdef CONSTEXPR
constexpr
#endif
size_t accumulator_count()
{
constexpr size_t nb_rows{2};
constexpr size_t nb_cols{2};
size_t nb{0};
for(size_t k = 0; k < nb_rows; ++k)
{
array<size_t,nb_cols> acc{}; // value initialization: expect both elements to be zero
//for const_cast/static_cast see http://stackoverflow.com/questions/34199774/why-is-non-const-stdarrayoperator-not-constexpr
#ifdef INIT_BY_HAND
for(size_t j = 0; j < nb_cols; ++j)
const_cast<size_t&>(static_cast<array<size_t,nb_cols> const&>(acc)[j]) = 0;
#endif
if(k == 0)
const_cast<size_t&>(static_cast<array<size_t,nb_cols> const&>(acc)[0]) = 1;
if(k == 1)
const_cast<size_t&>(static_cast<array<size_t,nb_cols> const&>(acc)[nb_cols-1]) = 1;
for(size_t j = 0; j < nb_cols; ++j)
nb += size_t(static_cast<array<size_t,nb_cols> const&>(acc)[j] != 0);
}
return nb;
}
int main()
{
#ifdef CONSTEXPR
constexpr
#endif
size_t nb{accumulator_count()};
std::cout << "nb: " << nb << std::endl;
}
在 gcc 5.3.1 (-Wall -std=c++14) 上编译时没有警告,但会产生 错误 输出 3。
如果没有 constexpr(注释掉 #define CONSTEXPR 1 行),它会正确输出 2。
手动初始化(#define INIT_BY_HAND 1 行中的注释)它正确输出 2。
使用 clang 3.8.0 编译,正确输出 2。
问题:这段代码是否符合 c++14 标准或者我错过了什么?
【问题讨论】:
-
所有与 const 之间的转换是怎么回事?
-
@Barry,OP 正在绕过之前的限制,即非常量
operator[]不是constexpr。