Возьмем следующее:
#include <vector>
#include <string>
#include <type_traits>
int main()
{
std::vector<std::string> vec{"foo", "bar"};
for (auto& el : vec)
el.std::string::~string();
auto& aliased = reinterpret_cast<
std::vector<
std::aligned_storage_t<sizeof(std::string), alignof(std::string)>
>&>(vec);
aliased.clear();
}
(конечно, без более сложного кода - в таком простом тестовом примере мы вообще не будем управлять простым вектором std::string
таким образом)
Есть ли в этой программе неопределенное поведение? Я думал, что мы не можем использовать псевдоним vector<T1>
как vector<T2>
, даже если T1
и T2
совместимы.
И если это так, можно ли ожидать, что это будет иметь практические последствия во время выполнения?
Предположим, что строгий псевдоним не отключен в компиляторе.
Интересно, что G CC 9.2.0 не дает мне никаких предупреждений с -fstrict-aliasing -Wstrict-aliasing
( live демо ).