下面的代碼是我所面臨的實際問題的簡化版本。
假設我沒有權限修改類A(因為它是外部庫),并且它已經在我的現有代碼庫中被廣泛使用。
在這種情況下,從一個臨時物件(直接構造器)進行的 const & 賦值是無效的,該物件也通過隱式轉換回傳一個 const & 成員變數。
在這種情況下,我如何防止或使其合法化,以便呼叫者獲得正確的A值?
class A
{
public:
A() { }
A(int _r, int _g, int _b)
: r(_r), g(_g), b(_b)。
{
}
~A(){ }
int GetR() const{ return r; }
int GetG() const { return g; }
int GetB() const{ return b; }
private:
int r = 0;
int g = 0;
int b = 0;
};
class Foo
{
public:
Foo() : Foo(A() {}.
Foo(int _r, int _g, int _b) 。a(A(_r, _g, _b)) {}。
explicit Foo(const A& _a) : a(_a) {}
Foo& operator=(const A& a)
{
*this = Foo(a)。
return *this;
}
operator A() const{ return a; }
operator const A&() const { return a; }
private:
A a;
};
int main()
{
const A& a = Foo(200, 100, 300)。
std::cout << a.GetR() << a.GetG() << a。 GetB() << endl; // I may not get 200 100 300 here as Foo is already out of scope .
return 0;
}
動機
關于我為什么要實作上述類的一些背景。類Foo的實際目的是包含兩個不同的物件,它們實際上具有相同的目的,只是內部存盤資料的方式不同。例如,我們說class A和class B,它們分別以int和floating(normalized)方式存盤顏色的RGB值。如上所述,我沒有權限修改類A,而且它已經在我的代碼庫中廣泛使用。
在我的代碼庫中,有大量的函式將const A&和const B&作為一個函式引數。所以我試圖為一個特殊的情況統一這兩個類,我可以在這些地方傳入Foo,它將按預期作業。
uj5u.com熱心網友回復:
你可以應用ref-qualified成員函式(自C 11以來),即用lvalue-reference標記轉換運算子,以防止它被呼叫到臨時性的(rvalues)。
class Foo
{
public:
... ...
operator A() const{ return a; }
operator const A&() const & { return a; }
operator const A&() & & = delete;
... ...
};
然后
const A& a = Foo(200, 100, 300); // invalid; invoke deleted operator[/span
const A& a = static_cast< A> (Foo(200, 100, 300)); // fine; 呼叫運算器A()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/314173.html
標籤:
