这个问题与这个职位有关。
一些权威用户表示,以下代码破坏了严格混叠规则。
#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)不会发出警告。
发布于 2015-03-25 10:34:21
发布于 2015-03-25 10:50:12
但是,我从不用指针来写数据.
标准中的语言比这更通用;basic.life/7有:
..。指向原始对象、引用原始对象或原始对象名称的指针.
在您的operator=中,您使用的是T类型的lvalue来写入data,在operator U中,您使用的是一个U类型的指针来读取它;如果U和T是无关的,而不是字符类型,则这是UB。
只需使用memcpy。它保证工作,它是有效的(尝试一下)!
https://stackoverflow.com/questions/29253100
复制相似问题