小编Bon*_*ero的帖子

如何使用非内联定义将成员添加到概念专用类

看看这段代码。

#include <type_traits>

template<typename T>
struct C;

template<typename T>
    requires std::is_integral_v<T>
struct C<T>
{
    void f();
};

template<typename T>
    requires std::is_integral_v<T>
void C<T>::f()
{

}

template<typename T>
    requires std::is_pointer_v<T>
struct C<T>
{
    void f();
};

template<typename T>
    requires std::is_pointer_v<T>
void C<T>::f()
{

}
Run Code Online (Sandbox Code Playgroud)

我想将函数添加到专业化中,如您所见,即非专业化变体中不存在的函数。但编译器说

类模板“C<T>”没有成员“f”。

上面的代码在 GCC 11.1.0 上编译没有任何问题,但在 Clang 13 或当前的 MSVC 上则不然。

我想转发声明的类C 而不进行任何实现。我不想有一个定义的类C,里面有一个f。在专业化中添加的内容f在我关心的基类中没有任何意义。

c++ c++-concepts c++20

13
推荐指数
1
解决办法
219
查看次数

为什么可以有const赋值运算符

使用 C++23 将会有

std::pair<T1, T1>::operator =( const pair &other ) const;
Run Code Online (Sandbox Code Playgroud)

对我来说,对 const 对象进行赋值运算符没有任何意义,因为对象无法修改。为什么 C++23 在pair上有这个运算符?更令人困惑的是:

std::pair<T1, T1>::operator =( pair &&other ) const;
Run Code Online (Sandbox Code Playgroud)

[编辑]:这不起作用,因为 this 指向的内容将是 const:

template<typename T>
struct S
{
    void operator +=( T x ) const;
    T m_x;
};

template<typename T>
void S<T>::operator +=( T x ) const
{
    m_x += x;
}

int main( int argc, char **argv )
{
    S<int> si;
    si += 1;
}
Run Code Online (Sandbox Code Playgroud)

那么为什么会有一个带有pair的const限定赋值运算符呢?

c++ c++23

13
推荐指数
1
解决办法
409
查看次数

为什么std :: get <T> for"variant"是一个全局函数?

任何人都可以告诉我为什么std::get<T>C++ 17是一个全局函数而不是一个成员函数variant<...>

c++ templates variadic-templates c++17

9
推荐指数
1
解决办法
443
查看次数

是否有任何定义如何在编译时求值的浮点值进行舍入?

是否有任何定义如何在编译时计算的浮点值在 C 或 C++ 中舍入?Fe 当我有double d = 1.0 / 3.0;? 即在编译时进行什么样的舍入。

是否定义了运行时线程的默认舍入模式(C99's / C++11's fegetround()/ fesetround())?

后面的配置参数中是否也包含四舍五入到整数值?我知道nearbyint(),但这被指定为绑定到可以通过设置的舍入参数fesetround()。我担心的是直接转换为整数。

c c++ floating-point ieee-754

9
推荐指数
1
解决办法
266
查看次数

将 nullptr 分配给成员指针

谁能告诉我为什么对于 MSVC、clang 和 g++,nullptr分配给类型数据成员指针的内部表示是 -1?Class::*对于 64 位系统来说(size_t)1 << 63是最好的,因为如果您nullptr以这种方式使用成员指针,您肯定会接触内核内存并发生崩溃,因此这将是一个很好的调试辅助工具。

-1背后有更深层次的原因吗?

样本:

struct X
{
    int x, y;
};

using member_ptr = int X::*;

member_ptr f()
{
    return nullptr;
}
Run Code Online (Sandbox Code Playgroud)

...使用 g++ 生成以下二进制文件:

movq    $-1, %rax
ret
Run Code Online (Sandbox Code Playgroud)

c++ pointer-to-member nullptr

9
推荐指数
1
解决办法
501
查看次数

有关NaN操作的问题

我的SSE-FPU生成以下NaN:

  • 当我做类似ADDSD,SUBSD,MULSD或DIVSD和两个操作数中的一个的任何基本的双操作是NaN,则结果具有南操作数的符号和结果的尾数的较低51位装载有NaN操作数的尾数的低51位.
  • 当两个操作都是NaN时,结果加载了目标寄存器的符号,结果 - 尾数的低51位在操作之前加载了目标寄存器的低51位.因此,当对两个NaN操作数进行乘法时,关联定律不计算在内!
  • 当我在NaN值上执行SQRTSD时,结果具有NaN操作数的符号,结果的低51位加载操作数的低51位.
  • 当我将无穷大与零或无穷大相乘时,我总是得到-NaN(二进制表示0xFFF8000000000000u).
  • 如果任何操作数是信令NaN,则如果未屏蔽异常,则结果变为安静的NaN.

这种行为是否在IEEE-754标准的任何地方确定?

floating-point x86 sse nan ieee-754

8
推荐指数
1
解决办法
621
查看次数

为什么std :: atomic &lt;T&gt; :: is_lock_free()和constexpr一样不是静态的?

谁能告诉我std :: atomic :: is_lock_free()是否像constexpr一样不是静态的?使它为非静态和/或为非constexpr对我来说没有意义。

c++ multithreading std lock-free stdatomic

8
推荐指数
2
解决办法
153
查看次数

如何测试概念中是否存在类型?

如何测试概念模板参数中是否存在成员类型,即 for typename Container、 test for Container::reverse_iterator?正确的要求子句是什么?

c++ c++-concepts c++20

8
推荐指数
1
解决办法
1033
查看次数

连接 std::variant&lt;a, b, c&gt; 和 std::variant&lt;x, y, z&gt; 的类型

有没有办法从两个现有变体类型声明第三个变体,其中包含两个变体类型的并集?

#include <variant>

using Var1 = std::variant<int, bool>;
using Var2 = std::variant<float, double>;

// both lines should yield the same
using MergedVariant = VariantUnion<Var1, Var2>; // <-- how to do this?
using MergedVariant = std::variant<int, bool, float, double>; // expected
Run Code Online (Sandbox Code Playgroud)

c++

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

有没有办法列出 C 或 C++ 运行时所有受支持的语言环境?

我很好奇我的 C 和 C++ 运行时支持的区域设置。那么有没有办法列出 C 或 C++ 运行时支持的语言环境?

如果没有:是否有依赖于平台的方法将 1:1 映射到 Linux 或 Win32 的 C 或 C++ 运行时区域设置字符串?

[EDIT1]:您提到的答案中没有给出我所要求的内容。Windows 的 EnumSystemLocalesEx() 不直接映射到 C-/C++-区域设置字符串,因为区域设置字符串缺少编码(如“.UTF8”)。对于 Linux,我不想通过命令行列出语言环境,而是通过系统 API 列出。

c c++ localization

7
推荐指数
0
解决办法
344
查看次数