上下文:我正在编写表达式模板和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
的求值?