MSVC 无法编译
#include <iostream>
template<int N, int = N>
struct A;
template<int, int V>
struct A{static constexpr int VALUE = V;};
int main() {
A<1> a;
std::cout << a.VALUE;
}
Run Code Online (Sandbox Code Playgroud)
与(3): error C2065: 'N': unknown identifier
(10): error C2975: 'V': invalid template argument 'A', constant expression expected(粗略翻译)。
clang默默地编译它。
那么问题来了:烂代码还是疯狂的 MSVC?
MSVC版本= VS 2019。
根据草案:
如果给定相同的输入,表达式会产生相同的输出,则该表达式是保持相等的。[ ... ]
和
[...]稳定:具有相同输入对象的此类表达式的两次评估需要具有相同的输出,而无需对这些输入对象进行任何显式干预修改。[...]
强调我的。
这些有什么区别?
什么时候一个表达式可以保持相等但不稳定,反之亦然?
在了解到 std::vector 在纯 C++ 中无法实现后,我想知道是否可以在不调用 UB 的情况下编写动态数组。我们不能在没有数组的情况下进行指针运算,这意味着我们不能有一个带有部分初始化内存的动态缓冲区并将其视为数组;所以 std::vector 必须依赖于定义一些行为的实现,否则它会是 UB。
动态数组是非常普遍的数据结构,而且通常很简单。能够一致地实现这一点似乎是不可能的,这使得 C++ 看起来像是一种不太通用的系统语言,IMO。
因此,我的问题是:
注意:这里使用动态数组来表示可以“就地”增长/收缩的线性数据结构,如 std::vector 或类似地,在堆中分配的 C 缓冲区 (m)。
可以在 C++20 中检查类型的偏序属性吗?如果是这样,如何使用概念进行这种检查?
以下代码足以满足此目的吗?
#include <compare>
#include <concepts>
template<class T>
concept PartialOrder = requires (const T& lhs, const T& rhs) {
// Is there any caveat in this?
{ lhs <=> rhs } -> std::convertible_to<std::partial_ordering>;
};
Run Code Online (Sandbox Code Playgroud) 考虑以下:
// Just a sequence of adjacent fields of same the type
#[repr(C)]
#[derive(Debug)]
struct S<T> {
a : T,
b : T,
c : T,
d : T,
}
impl<T : Sized> S<T> {
fn new(a : T, b : T, c : T, d : T) -> Self {
Self {
a,
b,
c,
d,
}
}
// reinterpret it as an array
fn as_slice(&self) -> &[T] {
unsafe { std::slice::from_raw_parts(self as *const Self as *const T, 4) …Run Code Online (Sandbox Code Playgroud) 我一直在问自己,临时对象是否确实具有身份。我知道以下内容是有效的:
object.temporary_object().modify()
Run Code Online (Sandbox Code Playgroud)
只要返回的对象是非常量对象,或者对象上调用的函数都不会修改不可变成员。
根据值类别的定义,prvalue的结果可以移动但没有标识,并且由于Temporary Objects是prvalue表达式的结果,如何修改它们?
c++ ×5
c++-concepts ×2
arrays ×1
c++20 ×1
object ×1
object-model ×1
return-value ×1
rust ×1
slice ×1
standards ×1
templates ×1
unsafe ×1
visual-c++ ×1