2017-08-18 17 views
0

ように振る舞う私は(https://wandbox.org/permlink/stCFKi0VQlF49Bxr)をコンパイルするために(もcppreference http://en.cppreference.com/w/cpp/utility/variant/visitで見つかった)次のコードを得ることができ派生クラスが集約

#include <type_traits> 
#include <utility> 

template <typename... Types> 
struct Overload : public Types... { 
    using Types::operator()...; 
}; 
template <typename... Types> 
auto make_overload(Types&&... instances) { 
    return Overload<std::decay_t<Types>...>{std::forward<Types>(instances)...}; 
} 

int main() { 
    auto overloaded = make_overload([](int) {}, [](double) {}); 
    static_cast<void>(overloaded); 
} 

どのように上記のコードは、C++ 17でコンパイルしていますか? C++ではコンパイルされません。舞台裏で何が起こっていますか?また、なぜvariadic using宣言がC++ 14で動作しないのですか?この新機能はどれですか?あなたはparameter_packで読むことができたよう

+0

興味深い。私はこれがC++ 14でもうまくいくと思っていました。 – Curious

+0

あなたの例を単純化することができます:C++ 17では、 'using'、' std :: decay_t'、 'std :: forward'を使わないでコンパイルする例 – max66

+2

この[link](http://en.cppreference.com/ w/cpp/language/aggregate_initialization)は、公共の拠点は、C++以降のクラスが集約されることをもはや防止しないと述べています。この[link](http://en.cppreference.com/w/cpp/language/parameter_pack)では、C++でバリデーションの 'using'が追加されたとのことです。 – HolyBlackCat

答えて

1

はすべて許可されたコンテキストのC++ 17

され、次のリストで導入:[...]

使用して、宣言
宣言を使用すると、宣言子のリストに省略記号が表示されることがあります。これは、パラメータパックから派生する場合に便利です。

template <typename... bases> 
struct X : bases... { 
    using bases::g...; 
}; 
X<B, D> x; // OK: B::g and D::g introduced