2016-10-30 44 views
-1
constexpr auto CHUNKS_X = 5, CHUNKS_Y = 5, CHUNKS_Z = 1; 
std::array<std::bitset<CHUNKS_X>, CHUNKS_Y> ys; 
std::array<decltype(ys), CHUNKS_Z> zs; 
if (CHUNKS_Z > 1) 
{ 
    zs[0] = ys; 
    //zs.at(1) = ys; //this works 
    zs[1] = ys; //this doesn't work 
    for (auto &x : zs[1]) 
    { 
     x.flip(); 
    } 
    for (auto z = 2; z < CHUNKS_Z; z++) 
    { 
     zs[z] = zs[z - 2]; 
    } 
} 

zs[1] = ys;給我的std ::陣列 - 只有在VS '大小爲n的緩衝區將溢出',

error C4789: buffer 'zs' of size 20 bytes will be overrun; 20 bytes will be written starting at offset 20 

但只有在VS.編譯時在命令行上編譯不會出現此類錯誤,也不會使用zs.at(1) = ys;。另外需要注意的是,MSDN說這應該是一個警告,而不是一個錯誤。

我意識到這可能是一個微妙的編譯器旗問題,但我沒有絲毫的線索在哪裏開始尋找。

Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x86 
+0

有什麼是'如果(CHUNKS_Z> 1)'這始終是假 – ZivS

+0

@ZivS這些常數關在另一個文件中,別人可能會改變。 – Sarvadi

+0

那麼,你的問題到底是什麼?該行代碼會超出緩衝區的末尾。該錯誤看起來很有用。順便說一句,你可能想要生成一個[mcve],因爲我懷疑'bitset'是生成你的問題所需要的(作爲一個例子)。 – Yakk

回答

1
std::array<decltype(ys), CHUNKS_Z> zs; 

相當於

std::array<decltype(ys), 1> zs; 

意思ZS是具有1個元素的陣列;

數組一般都是從零開始的,這意味着第一個元素位於zs[0],並且沒有更多元素,所以zs[1]要求數組將有第二個元素,它不在您的示例中。

既然你檢查if (CHUNKS_Z > 1)不應該有任何問題,因爲你不能到達zs[1] = ys;行,你不會得到任何問題。

如果我改變CHUNKS_Z2我不VS15得到任何錯誤

+0

好吧,那比我想象的要簡單得多。仍然沒有解釋爲什麼我在命令行編譯時沒有得到這個錯誤。 – Sarvadi