std::destroy_at 主要编译器之间的差异?

Ray*_*ann 0 c++ gcc std clang visual-c++

使用编译器资源管理器:

#include <iostream>
#include <memory>

struct test
{
  test(int i)
  {
    std::cout << "test::test("<<i<<")\n";
  }
  ~test()
  {
    std::cout << "~test()\n";
  }
};

template<>
void std::destroy_at(test* p) 
{
  std::cout<<"std::destroy_at<test>\n";
  p->~test();
}

int
main ()
{
  auto sp = std::make_shared<test>(3);
  return 33;
}
Run Code Online (Sandbox Code Playgroud)

使用带有 gcc x86-64 或 clang x86-64 的 C++20 给出预期输出:

Program returned: 33
test::test(3)
std::destroy_at<test>
~test()
Run Code Online (Sandbox Code Playgroud)

但 x64 msvc v19.32 给出:

Program returned: 33
test::test(3)
~test()
Run Code Online (Sandbox Code Playgroud)

好像 std::destroy_at 在这里没有效果。

这是符合行为、我的误解还是 msvc 不符合或配置错误?

Hol*_*Cat 5

自 C++20 以来,专门化标准库函数是UB 。

  • @RaymundHofmann 直到 C++20 (3认同)