Рассмотрим следующую программу:Cast указатель на структуру к указателю единственным членом этой структуры
#include <algorithm>
#include <iostream>
#include <vector>
struct foo {
foo(int value)
: value_(value)
{
// perform range checks
}
int value() const {
return value_;
}
private:
int value_;
};
int main() {
std::vector<foo> values{0, 1, 2, 3, 4, 5};
std::for_each(std::begin(values), std::end(values),
[](foo& f){ std::cout << f.value(); });
std::cout << std::endl;
std::for_each(reinterpret_cast<const int*>(values.data()),
reinterpret_cast<const int*>(values.data()) + values.size(),
[](int i){ std::cout << i; });
}
После компиляции с Apple, LLVM версии 6.0 (лязг-600.0.54) (на основе LLVM 3.5 СВН), то получается следующий результат (который является именно то, что я хочу):
Первая итерация тривиальна. Однако вторая итерация выполняется не через итераторы, а через указатели на базовое хранилище, которые были отлиты до const int*
.
Мой вопрос: Является ли этот код легальным?
Моя интуиция такова, что она есть. В соответствии с §5.2.10/7 стандарта C++ 11 (окончательный рабочий проект):
Когда prvalue v типа «указатель на
T1
» преобразуется к типу «указатель на сортаT2
», то результат будетstatic_cast<cvT2*>(static_cast<cvvoid*>(v))
, если обаT1
иT2
являются типа стандартной компоновки (3.9) и требования к расстановкеT2
не не строже, чем уT1
Если I интерпретировать это правильно, то код выше должен быть правильным, не так ли? Если нет, можно ли заставить его работать?
уверен в этом: это не нарушает строгое сглаживание (так как у структур есть объект «double» в качестве исходного элемента). Это напоминает мне требование 'std :: complex', в соответствии с чем его адрес должен быть конвертируемым в первый элемент массива из двух 'T's (i. E.' T * '). Поэтому я предполагаю, что в этом случае закрытие отступов не допускается, и вы будете в безопасности. –
Спасибо, я думаю, что это вполне может быть ответом. –
:) Я так не думаю - просто потому, что у меня нет стандартных доказательств, подтверждающих это ... просто пример. что это прекрасно, но это не гарантирует :) –