小编Naz*_*nho的帖子

MSVC 在前向类模板声明中阻塞

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

c++ templates visual-c++

7
推荐指数
1
解决办法
92
查看次数

保持平等和稳定有什么区别?

根据草案

如果给定相同的输入,表达式会产生相同的输出,则该表达式是保持相等的。[ ... ]

[...]稳定:具有相同输入对象的此类表达式的两次评估需要具有相同的输出,而无需对这些输入对象进行任何显式干预修改。[...]

强调我的。

  • 这些有什么区别?

  • 什么时候一个表达式可以保持相等不稳定反之亦然

c++ language-lawyer c++-concepts

7
推荐指数
1
解决办法
532
查看次数

没有未定义行为的 C++ 中的动态数组

在了解到 std::vector 在纯 C++ 中无法实现后,我想知道是否可以在不调用 UB 的情况下编写动态数组。我们不能在没有数组的情况下进行指针运算,这意味着我们不能有一个带有部分初始化内存的动态缓冲区并将其视为数组;所以 std::vector 必须依赖于定义一些行为的实现,否则它会是 UB。

动态数组是非常普遍的数据结构,而且通常很简单。能够一致地实现这一点似乎是不可能的,这使得 C++ 看起来像是一种不太通用的系统语言,IMO。

因此,我的问题是:

  • 如何用 C++(不使用 std::vector)编写符合标准的动态数组(普通数组,不一定是容器)?
  • 如何使这种实现具有时空效率(最好没有 UB 或实现特定的行为)?

注意:这里使用动态数组来表示可以“就地”增长/收缩的线性数据结构,如 std::vector 或类似地,在堆中分配的 C 缓冲区 (m)。

c++ arrays undefined-behavior language-lawyer

3
推荐指数
2
解决办法
189
查看次数

检查类型是否为偏序

可以在 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)

c++ spaceship-operator c++-concepts c++20

3
推荐指数
1
解决办法
142
查看次数

将结构体转换为数组是否合法?

考虑以下:

// 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)

unsafe object-model slice memory-layout rust

3
推荐指数
1
解决办法
959
查看次数

临时对象有身份吗?

我一直在问自己,临时对象是否确实具有身份。我知道以下内容是有效的:

object.temporary_object().modify()
Run Code Online (Sandbox Code Playgroud)

只要返回的对象是非常量对象,或者对象上调用的函数都不会修改不可变成员。

根据值类别的定义prvalue的结果可以移动但没有标识,并且由于Temporary Objects是prvalue表达式的结果,如何修改它们?

c++ standards object return-value

0
推荐指数
1
解决办法
61
查看次数