C++11 の raw 文字列のサポートに関して、Visual Studio 2013 コンパイラにバグがあるようです。
C++11 の新しい生の文字列は、たとえば次のようになりR"(\s(\d+))"ます。正規表現や複数行の文字列に非常に便利です。Visual Studio 2013 (および VS 2012 November CTP) はそれらをサポートしていますが、生の文字列をマクロ (単純なものであっても) 内に配置すると、問題が発生する可能性があります。
この単純なコードはコンパイルされますが、アサーションで失敗します。
#include <assert.h>
#include <string.h>
#define M(s) s
int main(int argc, char* argv[])
{
const char* s1 = M(R"()\s)");
const char* s2 = R"()\s)";
assert(strcmp(s1, s2) == 0);
return 0;
}
ノート:
- マクロは可能な限り単純です。
- 文字列内で右括弧を削除すると、すべてが機能します。
- 文字列内のバックスラッシュまたは
's'文字が削除されると、コードはコンパイルされません!
それは本当にコンパイラのバグですか?はいの場合、それは既知のバグですか? 回避策はありますか?