2014-12-03 45 views
0

所以我正在實現一個本地數組包裝器,它將允許這樣的函數參數傳遞並返回。我遇到了麻煩,但將其轉換爲本地數組無法返回本地數組。作爲替代,我決定使用轉換運算符的'右值'引用返回類型,但這不會正確執行,因爲如果我想將返回的對象綁定到「右值」引用以延長它的生存時間,則不會因爲它是'xvalue'而不是'prvalue'。有沒有解決這個問題的方法?也許一些'prvalue'投了?或者如果有其他方法來實現這種隱式轉換爲'數組'?C++ - 如何通過引用返回一個prvalue?

類:

template<typename type> 
struct tmp 
{ 
    tmp() {} 
    tmp(const tmp &) = default; 
    tmp(const type & arg) : tmp(*(const tmp*)arg) {} 

    && operator type() && {return static_cast<type&&>(d);} 

    ~tmp() { cout << "tmp destructor" << endl; } 

    type d; 

}; 

和使用它的代碼:

tmp<tmp<int [4]>> Func() // used 'tmp<int [4]>' instead of array to track object destruction (but normally it should be an native array type 
{ 
    return tmp<tmp<int [4]>>(); 
} 

int main() 
{ 
    tmp<int [4]> &&tmp1 = Func(); //implicit cast (from 'tmp<tmp<int [4]>>') to 'tmp<int [4]>', calls tmp::operator type() 

    cout << "Here" << endl; 

    return 0; 
} 

程序輸出:

TMP析

TMP析

這裏

正如你看到的演員操作符的返回值沒有擴展。

生活example

+0

'return tmp >();'只能是'return {};' – chris 2014-12-03 19:47:42

+0

問題是關於第8行返回值的隱式轉換。 – AnArrayOfFunctions 2014-12-03 19:49:14

+0

根據定義,忽略函數不能有任何對prvalues。你只能引用(可能是臨時的)對象。左值和xvalues是對象,prvalues不是。 – hvd 2014-12-03 19:49:52

回答

2

prvalue是一個右值,它不是一個xvalue,又名「一個臨時對象或其子對象,或一個與對象無關的值」。

不能創建一個數組,它是一個a temporary object (12.2),也可以創建一個數組值that is not associated with an object.

對於數組是一個prvalue,留下一個臨時對象的subobject thereof

所以一個tmp

template<typename type> 
struct tmp 
{ 
    tmp() {} 
    tmp(const tmp &) = default; 
    tmp(tmp &&) = default; 
    tmp(const tmp &&o):tmp(o) {} 
    tmp(tmp &o):tmp(const_cast<tmp const&>(o)){} 

    template<class... Ts> 
    tmp(Ts&&...ts) : v{std::forward<Ts>(ts)...} {} 

    ~tmp() { std::cout << "tmp destructor\n"; } 

    type v; 
}; 

一個wrap_as_tmp

template<class X, class... Ts> 
tmp<X> wrap_as_tmp(Ts&&... ts) 
{ 
    return {std::forward<Ts>(ts)...}; 
} 

跟蹤破壞我們使用noisy

struct noisy { 
    ~noisy() { std::cout << "bang\n"; } 
}; 

然後測試:

int main() { 
    auto&& x = wrap_as_tmp<noisy[4]>().v; 
    std::cout << "There\n"; 
} 

並注意在noisy對象爆炸之前的輸出。

live example

注意在函數調用結束使用.v

如果您的目標是避免這種情況,那就太糟糕了,您不能。

+0

真的太糟糕了。但'C++'從來不是一個理性和清晰的語言。 – AnArrayOfFunctions 2015-03-21 20:31:13