考虑以下程序。它只是将 a 复制constexpr const char *到 a static const char *。我希望指针被复制,并且是相同的。这就是 gcc、clang 和 msvc 的大多数选项都会发生的情况。
但是,当使用 flag/Zi标志而不是/ZI最近的 msvc 时,会触发断言。我想知道这是编译器错误还是只是未定义的行为。
#include <cassert>
constexpr const char *test = "test";
int main()
{
static const char *a = test;
assert(a == test);
}
Run Code Online (Sandbox Code Playgroud)
这是编译器资源管理器链接:https://godbolt.org/z/WPz7GPosa。只需在执行程序选项卡中更改/Zi为即可/ZI使断言消失。
谢谢!
在 C++20 中,聚合不能有用户声明或继承的构造函数(因此您不能将它们声明为删除)。那么有没有办法让结构体仍然是聚合的,但不可复制呢?
只是想知道转发函数模板参数的确切影响(和优点)是什么,即:
template <class F>
void foo(F &&f) {
f(1); // how does this call
std::forward<F>(f)(1); // differ from this one?
}
Run Code Online (Sandbox Code Playgroud)