看看这段代码。
#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++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限定赋值运算符呢?
任何人都可以告诉我为什么std::get<T>C++ 17是一个全局函数而不是一个成员函数variant<...>?
是否有任何定义如何在编译时计算的浮点值在 C 或 C++ 中舍入?Fe 当我有double d = 1.0 / 3.0;? 即在编译时进行什么样的舍入。
是否定义了运行时线程的默认舍入模式(C99's / C++11's fegetround()/ fesetround())?
后面的配置参数中是否也包含四舍五入到整数值?我知道nearbyint(),但这被指定为绑定到可以通过设置的舍入参数fesetround()。我担心的是直接转换为整数。
谁能告诉我为什么对于 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) 我的SSE-FPU生成以下NaN:
这种行为是否在IEEE-754标准的任何地方确定?
谁能告诉我std :: atomic :: is_lock_free()是否像constexpr一样不是静态的?使它为非静态和/或为非constexpr对我来说没有意义。
如何测试概念模板参数中是否存在成员类型,即 for typename Container、 test for Container::reverse_iterator?正确的要求子句是什么?
有没有办法从两个现有变体类型声明第三个变体,其中包含两个变体类型的并集?
#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 和 C++ 运行时支持的区域设置。那么有没有办法列出 C 或 C++ 运行时支持的语言环境?
如果没有:是否有依赖于平台的方法将 1:1 映射到 Linux 或 Win32 的 C 或 C++ 运行时区域设置字符串?
[EDIT1]:您提到的答案中没有给出我所要求的内容。Windows 的 EnumSystemLocalesEx() 不直接映射到 C-/C++-区域设置字符串,因为区域设置字符串缺少编码(如“.UTF8”)。对于 Linux,我不想通过命令行列出语言环境,而是通过系统 API 列出。