common_type编译错误与某些编译选项

时间:2015-05-22 19:49:57

标签: c++ c++11 template-meta-programming expression-templates

上下文:我正在编写表达式模板和C ++ 11功能。附带的代码示例只是一种乐趣的体验。在ET的这种变体中,每个表达式都跟踪它自己的返回类型。然后,编译器使用common_type来查找基于子表达式返回类型的其他表达式的返回类型。

问题:您可以看到完整示例here

我有一组函数可以使用common_type动态地计算出返回类型,如下所示:

template
    <
        typename... Args2,
        typename T1,
        template < typename... > class T2
    >
    Binary
    <
        T1,
        T2< Args2... >,
        typename common_type< T1 , typename select_last< Args2... >::type >::type
    > const
    operator*(T1 u, T2< Args2... > v)
{
    cout << "Operator (value, expr)" << endl;
    return Binary
    <
        T1,
        T2< Args2... >,
        typename common_type< T1 , typename select_last< Args2... >::type >::type
    >(u, v);
}

编译时 clang++ -std=c++11 -O3 -Wall -pedantic -Wextra main.cpp -lboost_iostreams -lz一切正常。使用clang++ -stdlib=libc++ -std=c++11 -O3 -Wall -pedantic -Wextra main.cpp -lcxxrt -ldl -lboost_iostreams -lz编译时,我会得到构建错误,其中非基元传递到common_type。 (又名incompatible operand types ('Unary<int, int>' and 'int')

问题:错误的功能是否匹配?即使在未使用的函数中,似乎也可以评估common_type。是否有一种简单的方法可以延迟对两个终端表达式运算符common_type的求值?

0 个答案:

没有答案