g ++ и clang ++ различное поведение с лямбда-захватом `std :: integra_constant` по ссылке - PullRequest
0 голосов
/ 30 декабря 2018

Учитывая следующий код

#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 ++ выдает обычную ошибку.

...