相关疑难解决方法(0)

标题中的`const`和`constexpr`变量应该是'inline`以防止ODR违规吗?

考虑以下标题并假设它在多个TU中使用:

static int x = 0;

struct A {
    A() {
        ++x;
        printf("%d\n", x);
    }
};
Run Code Online (Sandbox Code Playgroud)

正如这个问题所解释的那样,这是ODR违规,因此也就是UB.

现在,如果我们的函数引用非对象并且我们不在该函数中使用它(加上其他条款),则不存在ODR违规,因此这在头文件中仍然可以正常工作:inlinevolatile const

constexpr int x = 1;

struct A {
    A() {
        printf("%d\n", x);
    }
};
Run Code Online (Sandbox Code Playgroud)

但如果我们确实碰巧使用它,我们又回到UB的第一个方面:

constexpr int x = 1;

struct A {
    A() {
        printf("%p\n", &x);
    }
};
Run Code Online (Sandbox Code Playgroud)

因此,鉴于我们现在有inline变量,指南是否应该在标题中标记所有namespace变量inline以避免所有问题?

constexpr inline int x = 1;

struct A {
    A() {
        printf("%p\n", &x);
    }
};
Run Code Online (Sandbox Code Playgroud)

这似乎也更容易教,因为我们可以简单地说" inline标题中的所有内容"(即函数和变量定义),以及"从不static …

c++ language-lawyer c++17

15
推荐指数
1
解决办法
610
查看次数

标签 统计

c++ ×1

c++17 ×1

language-lawyer ×1