All*_*nzi 6 c++ templates sfinae c++11
通过使用Expression SFINAE,您可以检测是否支持某些操作员或操作.
例如,
template <class T>
auto f(T& t, size_t n) -> decltype(t.reserve(n), void())
{ t.reserve(n); }
Run Code Online (Sandbox Code Playgroud)
我的问题是t.reserve(n)内部decltype被执行与否?
如果是,这是否意味着t.reserve(n)执行了两次,一次在内部decltype,另一次在函数体内?
如果没有,是否只是在编译期间检查验证?但是为什么它没有被执行,我认为逗号分隔表达式列表中的所有表达式都将被执行.
Bar*_*rry 14
不,来自[dcl.type.simple]:
说明符的操作数
decltype是未评估的操作数(第5条).
这意味着,来自[expr]:
在某些情况下,出现了未评估的操作数(5.2.8,5.3.3,5.3.7,7.1.6.2).未评估未评估的操作数.未评估的操作数被视为完整表达式.
因此,在这个特定的上下文中,目的decltype(t.reserve(n), void())是验证这t.reserve(n)是一个有效的表达式.如果是,则该函数是一个可行的重载,其返回类型为void,并且reserve()将被调用一次(在函数体中).如果不是,那么我们有替换失败,并且该函数不是可行的超载候选者.
| 归档时间: |
|
| 查看次数: |
448 次 |
| 最近记录: |