c – 在给定表达式的情况下返回对类型的引用时出错:`cond? * this:throw()`

前端之家收集整理的这篇文章主要介绍了c – 在给定表达式的情况下返回对类型的引用时出错:`cond? * this:throw()`前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这似乎是一个错误,但我只是想确认一下.以下是否良好形成?如果没有,为什么不呢?
#include <iostream>

struct X
{
    int value;
    constexpr X(int value) : value(value) {}

    constexpr X& do_something(int x)
    {
        return x < 3 ? *this : throw("FAIL");
        //return *this;
    }
};

int main()
{
    X x(2);
    std::cout << x.do_something(1).value << std::endl;
}

在VC 2015 R3下使用默认解决方案开关,我得到:

warning C4172: returning address of local variable or temporary

g(GCC)5.4.0带开关-Wall -pedantic我得到:

error: invalid initialization of non-const reference of type ‘X&’ from an rvalue of type ‘X’
   return x < 3 ? *this : throw("FAIL");
                                      ^

但是,使用开关-Wall -pedantic的clang版本3.9.1(标签/ RELEASE_391 / final)没有问题.

使用return * this;当然没有问题.

解决方法

由于你有一个C 14标签,代码是100%格式良好的C 14.

Core issue 1560在这里删除了免费的左值到左值转换,并且作为缺陷报告解决方案,它最终应该一直应用于提供这种模式的C 98/03模式的编译器.

另见GCC bug 64372.

猜你在找的C&C++相关文章