私はこの非常に単純なコードを持っています。MSVCC/g ++/iccのstd deque/vectorの動作が異なります
#include <deque>
#include <vector>
using namespace std;
class A
{
public:
A(){};
~A(){};
deque<A> my_array; // vector<A> my_array;
};
int main(void)
{
}
私はLinux上でg ++およびICC/ICPCの両方で、このコードをコンパイルした場合、それは何の警告を与えなくても-Wall
と、罰金コンパイル。両端キューをベクトルに入れ替えると、状況は同じです。
私はMSVCC(CL)を使用してWindows上でこのコードをビルドしたいと思いますが、残念ながら、それはエラーC2027をスロー:
error C2027: use of undefined type 'A'
しかし、私はそれは、Visual Studio 2010
と罰金コンパイルstd::vector
に
std::deque
を変更した場合
私の質問は、何らかの理由でこの動作が予想されるのでしょうか?もしそうなら、なぜコンパイラ間に違いがあるのですか、これはg ++/iccまたはMSVCCの間違いでしょうか?
+1しかし、私は 'deque'だけのUBであることを期待していました。 – iammilind
"標準が関係している限り、どのような実装でも問題ありません" - 準拠している実装では、定義されていない動作があるからといってコンパイルに失敗してはいけません。もちろん、診断を与えることはできますが、その診断がただの警告である準拠モードに実装を置くことは、あまり目立たないことがあります。 –
@SteveJessop標準 (§1.3.12)の_undefinedビヘイビア_の定義は、「この国際規格では **の**要件はありません」(明示的に追加)を明示しています。直後の の注記では、 の実装の例として、[**翻訳**を終了するための[...]または診断メッセージの発行( との実行)を示しています。 –