将 _Atomic(type) 转换为类型

kon*_*las 7 c casting atomic

考虑以下 C 代码:

#include <stdatomic.h>

struct _opaque;
typedef struct _opaque *opaque;
struct container { _Atomic opaque x; };

struct container get_container();
void consume_opaque(opaque);

void test() {
    consume_opaque(get_container().x);
}
Run Code Online (Sandbox Code Playgroud)

编译失败(Clang 16)并出现错误:

error: passing '_Atomic(opaque)' to parameter of incompatible type 'opaque' (aka 'struct _opaque *')
Run Code Online (Sandbox Code Playgroud)

即使在尝试显式转换参数:之后,此代码仍然无法编译(opaque) get_container().x

相比之下,请考虑以下事项:

#include <stdatomic.h>

struct _opaque;
typedef struct _opaque *opaque;
struct container { _Atomic opaque x; };

struct container *get_container();
void consume_opaque(opaque);

void test() {
    consume_opaque(get_container()->x);
}
Run Code Online (Sandbox Code Playgroud)

这编译得很好,编译器显然很乐意进行转换get_container()->x,但get_container().x在容器按值返回的情况下则不然。

为什么会这样呢?如何让编译器在第一个示例中进行转换而不将返回值显式保存get_container()到局部变量?