这似乎是一个错误,但我只是想确认一下.以下是否良好形成?如果没有,为什么不呢?
#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模式的编译器.