我有一個帶有回傳值的函式的類。由于復雜的原因,需要回傳值作為const參考。
(最小作業示例包含一個int陣列,實際代碼具有更復雜的物件,因此參考)
class Foo
{
public:
static constexpr const int OUT_OF_BOUNDS_VALUE = -9999;
const int& ret(int i) const { return i < 0 || i > 4 ? OUT_OF_BOUNDS_VALUE : test[i]; }
private:
int test[5] = {0, 1, 2, 3, 4};
};
這warning C4172: returning address of local variable or temporary在 VS2015 中給了我,它甚至不能用 GCC 編譯。
- 在
constexpr const int Foo::OUT_OF_BOUNDS;外面添加一行Foo讓 GCC 編譯得很好。VS2015 仍然給出警告。 constexpr從定義中洗掉和拆分宣告修復了警告,但為什么我必須這樣做?
OUT_OF_BOUNDS 不是本地的,也不是臨時的,對吧?它在類定義中定義和宣告時是否沒有地址?
實時查看警告:https : //godbolt.org/z/fv397b9rr
uj5u.com熱心網友回復:
的問題是,在C 11,我們必須添加一個相應定義為一個靜態constexpr宣告一個類的資料成員的。這將在下面更詳細地解釋:
C 11
class Foo
{
public:
static constexpr const int OUT_OF_BOUNDS_VALUE = -9999; //THIS IS A DECLARATION IN C 11 and C 14
//other members here
};
在上面的代碼片段(用于C 11、C 14)中,我們在類中宣告了靜態資料成員OUT_OF_BOUNDS_VALUE。因此,我們必須在一個翻譯單元中提供相應的定義。否則你會得到一個聯結器錯誤,可以在這里看到。
也就是說,在一個翻譯單元中,我們應該寫:
constexpr const int Foo::OUT_OF_BOUNDS;//note no initializer
C 17
class Foo
{
public:
static constexpr const int OUT_OF_BOUNDS_VALUE = -9999; //THIS IS A DEFINITION IN C 17
//other members here
};
在上面的代碼片段(用于C 17)中,我們在類中定義了靜態資料成員OUT_OF_BOUNDS_VALUE。所以從 C 17 開始,我們不必在其他任何地方提供定義,OUT_OF_BOUNDS_VALUE因為我們已經在類中定義了它。
您使用MSVC收到的警告似乎是一個錯誤。
uj5u.com熱心網友回復:
當您constexpr在函式中使用 時,會創建一個臨時本地實體。您可以嘗試在靜態成員的宣告中省略constexpr和省略,以便您擁有一個可以參考的物件/實體。staticOUT_OF_BOUNDSconst
編輯:如果你必須有一個靜態成員,宣告它const static int并將定義const int Foo::OUT_OF_BOUNDS = -1;放在適當的位置。
uj5u.com熱心網友回復:
test[i]是int,您將它系結到const intreturn 陳述句中的參考。不?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385118.html
