VS2013在返回Rvalue时警告C4172

时间:2015-11-04 08:02:36

标签: c++ c++11 visual-studio-2013 type-erasure rvalue

Rvalues是新的,所以我对它有些怀疑......

VS2013给出了

setVisibility(View.INVISIBLE);

这一行

warning C4172: returning address of local variable or temporary

此代码(下方)是否无法移植和/或在任何地方都有未定义的行为?如果有 - 在哪里以及为什么?难道我做错了什么? 或者这只是VS2013编译器的假阳性警告,我应该在实际情况下将pragma忽略它?

temp_value_t旨在用作级联调用的容器:

[打字值] - >调用virtual_func1(temp_value_t) - >调用virtual_func2(temp_value_t) - > ... - >调用virtual_funcLAST(temp_value_t)

和funcLAST实现知道temp_value_t是否真的是右值或左值,因此funcLAST知道应该使用哪个函数。

return (std::wstring&&)         (*(std::wstring*)v);

1 个答案:

答案 0 :(得分:0)

为什么不存储给定字符串的引用?

class temp_value_t
{
    private:
        const std::wstring & v;
    public:
        temp_value_t(const std::wstring & s)
            : v(s)
        {
        }

        // You can't store reference if you are expecting an rvalue.
        // Because, that rvalue is going to or may expire soon,
        // and when that happens, the stored reference will be invalid.
        //temp_value_t(std::wstring && s)
        //  : v(std::move(s))
        //{
        //}

        // This will already return an rvalue.
        // It is meaningless to cast it to (std::wstring&&).
        std::wstring get_as_temp()
        {
            return v;
        }

        const std::wstring & get_as_const()
        {
            return v;
        }
};

如果你的目标是存储一个作为右值引用传递的字符串对象,定义一个移动构造函数,并将rvalue字符串本地存储在对象中。