volatile struct = struct not possible, why?

后端 未结 3 762
粉色の甜心
粉色の甜心 2021-01-01 13:26
struct FOO{
    int a;
    int b;
    int c;
};

volatile struct FOO foo;

int main(void)
{
    foo.a = 10;
    foo.b = 10;
    foo.c = 10;
    struct FOO test = foo         


        
3条回答
  •  执笔经年
    2021-01-01 13:40

    This is ill-formed because FOO has an implicit copy constructor defined as:

    FOO(FOO const&);
    

    And you write FOO test = foo; with foo of type volatile FOO, invoking:

    FOO(volatile FOO const&);
    

    But references-to-volatile to references-to-non-volatile implicit conversion is ill-formed.

    From here, two solutions emerge:

    1. don't make volatile to non-volatile conversions;
    2. define a suited copy constructor or copy the object members "manually";
    3. const_cast can remove the volatile qualifier, but this is undefined behavior to use that if your underlying object is effectively volatile.

    Could I possibly use memcopy() for that?

    No you cannot, memcpy is incompatible with volatile objects: thre is no overload of it which takes pointers-to-volatile, and there is nothing you can do without invoking undefined behavior.

    So, as a conclusion, your best shot if you cannot add a constructor to FOO is to define:

    FOO FOO_copy(FOO volatile const& other)
    {
        FOO result;
        result.a = other.a;
        result.b = other.b;
        result.c = other.c;
        return result;
    }
    

    Or with C++11's std::tie:

    FOO FOO_copy(FOO volatile const& other)
    {
        FOO result;
        std::tie(result.a, result.b, result.c) = std::tie(other.a, other.b, other.c);
        return result;
    }
    

提交回复
热议问题