Tôi đã thực hiện một mảng constexpr
như thế này:Không thể xây dựng mảng constexpr từ chuẩn bị tinh thần-init-list
template <typename T>
class const_array {
const T* p;
unsigned n;
public:
template <unsigned N>
constexpr const_array(const T(&a)[N]): p(a), n(N) { }
constexpr unsigned size() const { return n; }
};
int main(int argc, char* argv[]) {
// works
static_assert(const_array<double>{{1.,2.,3.}}.size() == 3);
// doesn't compile
constexpr const_array<double> a{{1.,2.,3.}};
static_assert(a.size() == 3);
}
Tại sao nó rằng static_assert
biên dịch đầu tiên, nhưng khởi a
thất bại Tôi đang sử dụng gcc 6.2? .0. Tôi đang nhận được
: In function 'int main(int, char**)':
: error: 'const_array<double>{((const double*)(&<anonymous>)), 3u}' is not a constant expression
constexpr const_array<double> a{{1.,2.,3.}};
^
test/const_array.cc:17:3: error: non-constant condition for static assertion
static_assert(a.size() == 3);
^~~~~~~~~~~~~
Bạn đã xác định 'a' hai lần. Cũng giống như một chuyển đổi tiềm ẩn có thể xảy ra. Bạn có nhận được bất kỳ cải tiến nào nếu bạn trang trí cho c'tor một cách rõ ràng không? – KyleKnoepfel
@KyleKnoepfel Làm cho hàm tạo rõ ràng không hữu ích. – SU3
'a1' thất bại trong clang với' con trỏ trỏ tới subobject của tạm thời không phải là một biểu thức liên tục'. – jbapple