Законно ли C ++?
Если под «легальным» вы подразумеваете «правильно сформированный», то да.
Если под «легальным» вы подразумеваете «допустимый» и будет работать на любом компиляторе и стандартной библиотекереализации, то нет, потому что std::tuple
не является POD.
Почему мне разрешено вызывать std::get
(что не constexpr
) внутри constexpr
функции?
По сути, функция constexpr
не обязательно должна состоять только из константного выражения. Если вы попытаетесь использовать функцию tuple_element_offset()
в константном выражении, вы получите ошибку компиляции.
Идея состоит в том, что функция может использоваться в постоянном выражении в некоторых обстоятельствах, но не в других, поэтому нет ограничения на то, что функция constexpr
всегда должна использоваться в постоянном выражении (посколькуэто не такое ограничение, также возможно, что конкретная функция constexpr
никогда не сможет использоваться в константном выражении, как в случае с вашей функцией).
Черновик C ++ 0x имеет хорошийпример (из 5.19 / 2):
constexpr const int* addr(const int& ir) { return &ir; } // OK
// OK: (const int*)&(const int&)x is an address contant expression
static const int x = 5;
constexpr const int* xp = addr(x);
// Error, initializer for constexpr variable not a constant expression;
// (const int*)&(const int&)5 is not a constant expression because it takes
// the address of a temporary
constexpr const int* tp = addr(5);