首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板参数运算符的SFINAE检查

模板参数运算符的SFINAE检查
EN

Stack Overflow用户
提问于 2020-01-23 16:22:51
回答 2查看 44关注 0票数 0

你能告诉我为什么下面的代码编译失败(在MSVC中“没有找到匹配的重载函数”):

代码语言:javascript
复制
template<typename V>
struct LinearModel { // has basis vectors
    template<typename T = V>
    auto consolidation() const -> decltype(std::declval<T>() += (std::declval<T>() *= double())) {
        V linearCombination;
        // linearly combine basis vectors using += and *=
        return linearCombination;
    }
};

int main(){
    LinearModel<double> lm;
    auto c = lm.consolidation(); // the line that produces the error
    return 0;
}

我的意图是只为具有T& operator *=(double)T& operator +=(T)T定义LinearModel<T>::consolidation()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-23 16:32:17

Tdeclval返回T&&,不允许将*= (或其他赋值操作)的结果赋给R-value。

如果您想获得左值,请使用:declval<T&>()

代码语言:javascript
复制
    -> std::remove_reference_t<decltype(std::declval<T&>() += (std::declval<T&>() *= double{}))> 

Live demo

票数 2
EN

Stack Overflow用户

发布于 2020-01-23 16:53:05

根据@rafix07的回答,我最后做了什么:

代码语言:javascript
复制
    template<typename T = std::remove_reference_t<decltype(std::declval<V&>() += (std::declval<V&>() *= double()))>>
    T consolidation() const {
        T linearCombination;
        // ...
        return linearCombination;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59874162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档