VC2019:编译器漏洞,std::pair漏洞或者晦涩特性

6
以下代码会使应用程序崩溃或输出无意义的内容。如果将基类的初始化替换为str_int{ string{V}, 0},那么它就可以正常工作。似乎在某些在线编译器上工作正常。
#include <iostream>
#include <utility>

using namespace std;

using str_int = pair<string, int>;

template< const char* V > 
struct C : public str_int
{
  C() : str_int{ V, 0} {}
};

constexpr const char str[] = "abc";

int main()
{
  // works fine
  str_int si{str, 0};
  cout << si.first;

  // crashes the application or prints gibberish
  C<str> c;
  cout << c.first;
}

1
虽然这样的情况很罕见,但我敢说这是MSVC编译器的一个错误(在Visual Studio中使用clang-cl则不会出现你的代码问题)。 - Adrian Mole
在使用旧版本的MSVC(v19.16)进行测试时,我不得不添加<string>头文件。添加这个头文件会对你的测试有什么影响吗? - Richard Critten
@RichardCritten 在我的VS(16.9.2)中,添加<string>头文件并不能解决问题(虽然这是一个好的发现)。 - Adrian Mole
@RichardCritten 在我的版本(VS16.7.5)中添加<string>没有任何效果。 - zdf
6
这是CWG2043/CWG2401;该代码在C++20中有效。 - Davis Herring
2
这与std::pairstd::string无关,我已经报告了一个简化版本:https://developercommunity.visualstudio.com/t/bad-code-generation-on-passing-template-const-char/1534999 - Alex Guteniev
1个回答

3

很好的跟进👍 - Dave Newton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接