簡體   English   中英

左側的右值

[英]rvalue on the left side

為什么要編譯這段代碼? 我認為 ctor 返回的右值不在內存中,因此不能用作左值。

#include <iostream>
#include <vector>

class Y {
public :
    explicit Y(size_t num = 0)
    : m_resource {std::vector<int>(num)}
    {
    }

    std::vector<int> m_resource;
};

int main(int argc, const char * argv[]) {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}

根據見 12.8 [class.copy] 第 18 段,綜合賦值運算符被聲明為其中之一(如果它可以被綜合並且未被聲明為已刪除):

  • Y& Y::operator=(Y const&)
  • Y& Y::operator=(Y&) ()

也就是說,就像任何其他沒有用ref-qualifiers明確聲明的成員函數一樣,它適用於右值。

如果您想防止分配左側的臨時對象,您需要相應地聲明它:

class Y {
public :
    explicit Y(std::size_t num = 0);
    Y& operator= (Y const&) & = default;
};

該標准在= default之前為&使用名稱ref-qualifier 相關提案為N2439 我不知道ref-qualifiers哪里有很好的描述。 這個問題有一些信息。

不知道你從哪里得到那個特定的經驗法則。 如果有的話,經驗法則是(來自 Scott Meyers):如果它有名字,它就是一個左值。

在這種情況下,您正在創建一個臨時對象並將其傳遞給分配方法/函數。 沒有問題。 事實上,這樣做甚至可能是有意義的,例如

// Applies foo to a copy, not the original.
(Y(1) = y).foo()

不過, Y(*)確實在這里沒有名稱,因此它們是右值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM