首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三值算子中的Nullptr

三值算子中的Nullptr
EN

Stack Overflow用户
提问于 2015-09-03 14:10:36
回答 1查看 1.7K关注 0票数 5

考虑:

代码语言:javascript
复制
struct A { bool operator==(const A& that) { return true; } };
boost::optional<A&> f()
{
    std::vector<A> vec;
    auto it = std::find(vec.begin(), vec.end(), A());

    // Version A
    return (it == vec.end() ? nullptr : *it);

    // Version B
    if (it == vec.end()) {
        return nullptr;
    } else {
        return *it;
    }
}

为什么版本A不编译(错误C2446:没有从'A‘到’nullptr‘的转换),而B版本呢?

)我知道我能做到。

代码语言:javascript
复制
return (it == vec.end() ? boost::optional<A&>() : *it);

我的问题是:为什么nullptr的构造与三元操作符的处理方式不同?)

仅在msvc12上测试(= 2013)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-03 14:21:53

标准5.16中的三元算子规则

如果第二个操作数和第三个操作数有不同的类型,或者具有(可能是cv限定的)类类型,或者两者都是值类别相同和类型相同(cv限定除外)的值,则尝试将每个操作数转换为另一个操作数的类型。 ..。 否则(如果E1或E2具有非类类型,或者如果它们都有类类型,但底层类不相同,也不是另一个基类):如果E1可以隐式转换为E2在应用lvalue- to - rvalue (4.1)、数组到指针(4.2)和函数- to -指针(4.3)标准转换后将具有的类型,则可以转换为匹配E2。

A不是隐式可转换为nullptrnullptr也不是隐式可转换为A

第二个版本是编译的,因为有一些从nullptroptional的隐式转换。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32378016

复制
相关文章

相似问题

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