<div dir="ltr"><div>In C++17, is a constexpr-declared variable is captured by copy in a lambda a core constant expression within the body of the lambda?<br></div><div><br></div><div>For example, GCC fails to compile the following example because it considers "i" not to be a constant expression within the body of the lambda, while Clang accepts it. Removing the capture of i reverses the behavior (Clang rejects it and GCC accepts it).</div><div><br></div><div><div>#include <utility></div><div><br></div><div>template<int I></div><div>constexpr auto unwrap(std::integral_constant<int, I>) {</div><div>  return I;</div><div>}</div><div><br></div><div>int main() {</div><div>  constexpr auto i = std::integral_constant<int, 42>{};</div><div>  constexpr auto l = [i]() {</div><div>    constexpr int x = unwrap(i);</div><div>  };</div><div>}</div></div><div><br></div><div>GCC Wandbox link: <a href="https://wandbox.org/permlink/oB7VEymVTfDQuxYG">https://wandbox.org/permlink/oB7VEymVTfDQuxYG</a></div><div>Clang Wandbox link: <a href="https://wandbox.org/permlink/2H7zezNFXdQdyaBz">https://wandbox.org/permlink/2H7zezNFXdQdyaBz</a></div><div><br></div><div>On <a href="https://stackoverflow.com/questions/44386415/gcc-and-clang-disagree-about-c17-constexpr-lambda-captures">Stack Overflow</a>, it was suggested that this is a bug in Clang and the closure type should not be a constant expression, but I wanted to get a second opinion from the Clang developers.<br></div><div><br></div><div>I'm invested in this question because I recently wrote a C++17 library that makes heavy use of Clang's behavior in this case, but using this idiom makes it difficult to support GCC and Clang without a lot of ifdefs. So I'd like to confirm the correct interpretation of the standard before I decide on how to refactor my code.</div><div><br></div><div>Thanks for reading,</div><div><br></div><div>Jackie</div></div>