Учитывая следующий код
#include <type_traits>
int main ()
{
std::integral_constant<int, 42> ic;
[&]{ constexpr int i = ic; (void)i; }();
}
((void)i;
только для того, чтобы избежать предупреждения о «неиспользуемой переменной») clang ++ компилируется без проблем, где g ++ выдает следующую ошибку
prog.cc: In lambda function:
prog.cc:7:27: error: '__closure' is not a constant expression
7 | [&]{ constexpr int i = ic; (void)i; }();
| ^~
Захват по значению
[=]{ constexpr int i = ic; (void)i; }();
Оба компилятора компилируются без проблем.
Вопрос, как обычно, таков: кто прав?g ++ или clang ++?
- EDIT -
Как указано JVApen, ic
не определено constexpr
;Так как же переменная not-constexpr инициализировать переменную constexpr
?
В любом случае, поведение не меняется, определяя ic
как constexpr
constexpr std::integral_constant<int, 42> ic;
clang ++ без компиляции;g ++ выдает ошибку при захвате по ссылке.
- EDIT -
Как указал Ян, определяя ic
как constexpr
и используя совокупную инициализацию
constexpr std::integral_constant<int, 42> ic{};
оба компилятора компилируются без проблем.
Но без constexpr
std::integral_constant<int, 42> ic{};
g ++ выдает обычную ошибку.