該問題與this post有關。使用指針轉換來存儲/轉換值:我打破嚴格的別名規則嗎?
一些權威用戶聲稱以下代碼打破strict aliasing rules。
#include <boost/static_assert.hpp>
template <typename T>
struct MyType {
private:
T data;
public:
template <typename U>
operator U() {
BOOST_STATIC_ASSERT_MSG(sizeof(U) == sizeof(T),"Trying to convert to data type of different size");
return *((U*) &data);
}
template <typename U>
NeonVectorType<T>& operator =(const U& in) {
BOOST_STATIC_ASSERT_MSG(sizeof(U) == sizeof(T),"Trying to copy from data type of different size");
data = *((T*) &in);
return *this;
}
}
不過,我從來沒有使用指針寫數據,而我從來沒有分享它的指針,所以我不能看到包含在變量值如何更改,恕不編譯器意識到這是發生。我的印象是,也許我打破了一些規則,但不是嚴格的別名...
注意:我不知道這有多重要,但我的編譯器(gcc 4.9)不會發出警告。
我懷疑你混淆了嚴格的別名規則與指針別名,這是一種不同的別名形式。 – molbdnilo 2015-03-25 10:37:52