C ++ 17的Variadic`using`:编译器之间的差异

时间:2018-03-20 09:31:54

标签: c++ gcc visual-c++ c++17 clang++

关于C++17's Variadic using的主题,我正在关注video。因此,出于好奇,我在这里尝试了这段代码片段,就像在我自己​​的IDE MS Visual Studio 2017 CE中一样,编译器语言设置为c++17

#include <iostream>
#include <utility>

template<typename ... B>
struct Merged : B... {
    template<typename ... T>
    Merged( T && ... t ) : B( std::forward<T>( t ) )... {
    }

    using B::operator()...;
};

template<typename ... T>
Merged( T... ) -> Merged<std::decay_t<T>...>;

int main() {
    const auto l1 = []() { return 4; };
    const auto l2 = []( const int i ) { return i * 10; };

    Merged merged( l1, l2, []( const double d ) { return d * 3.2; } );

    std::cout << merged() << "\n";
    std::cout << merged( 5 ) << "\n";
    std::cout << merged( 4.5 ) << "\n";

    return 0;
} 

当然无法编译。然后我冒险尝试使用内置编译器的网站。我尝试使用Compiler Explorer并使用该网站上提供的大多数编译器版本为c++17设置适当的编译器选项。他们都没能编译。我最终尝试WandBox 它似乎只为Clang版本5.0及更高版本编译。 GCC编译器都不会从Compiler ExplorerWandBox编译它,并且唯一编译和运行它的编译器是Clang WandBox编译器}}。

我对实际尝试这项工作并不感兴趣;我只是好奇或对视频本身的主题感兴趣。当我尝试实现代码时,对于从C ++语言的一个编译器到另一个编译器的变化有多么奇怪和显而易见。

为什么在这种特定情况下出现Clang's版本5.0+是唯一完全支持C++17语言功能的语言,其语法目前就是这样?

0 个答案:

没有答案