茂加部珈琲店

主にtech関連のメモ置き場です

[g++7.1] ジェネリックラムダが不要な場合にもインスタンス化されるバグ

ちょっと調べたのでメモ
以下のコードはg++ 7.1、g++7.2でコンパイルに失敗します。

#include <variant>
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

using v = std::variant<double, long, bool>;
 
constexpr const char* get_name(const v& v) {
   return std::visit(
    overloaded{
      [](bool) constexpr { return "bool"; },
      [](double) constexpr { return "double"; },
      [](long) constexpr { return "long"; }, 
      // 網羅していない場合はコンパイルを失敗させる
      [](auto a) constexpr { static_assert(!sizeof(decltype(a)));  }},
    v);
}

これはジェネリックラムダが不要な場合にもインスタンス化されるためです。
以前から報告されており、g++7.3で修正されました。