Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

1
为什么不同块中相同命名的extern局部变量在c ++中的编译器之间得到不同的链接?
当我只是检查哪些链接被授予外部局部变量时, 我发现编译器之间存在一些不同的行为 例如,如果我测试了下面的代码, 如您在comment变量中看到的那样,var它们具有不同的链接 // foo.cpp int var = 10; // external linkage // main.cpp #include <iostream> static int var = 100; // internal linkage int main() { extern int var; // internal linkage std::cout << var << std::endl; { extern int var; // g++: external linkage , clang++: internal …
12 c++  g++  clang++  extern  linkage 

1
`equality_comparable_with`是否需要要求`common_reference`?
的概念equality_­comparable_with<T, U>旨在声明类型的对象T和U可比较彼此相等,而如果是这样,则这具有预期含义。没关系。 但是,这个概念也必须common_reference_t<T&, U&>存在。对于主要推动力common_reference和随之而来的功能似乎是启用代理迭代器,有代表之间的关系的地方reference,并value_type为这样的迭代器。 太好了,但是...与a T和a是否U可以彼此相等进行测试有什么关系?为什么标准要求这样做T并U具有共同的引用关系,以使您可以比较它们相等? 这就产生了奇怪的情况,在这种情况下,很难拥有两种在逻辑上不具有合理可比性的公共参照关系的类型。例如,vector<int>并且pmr::vector<int>在逻辑上应该是可比较的。但是它们之所以不可以,是因为这两个原本不相关的类型之间没有合理的公共引用。

2
是否可以在编译时连接两个类型为const char *的字符串?
显然,我们可以在一个constexpr函数中连接两个字符串文字,但是如何将一个字符串文字与另一个constexpr函数返回的字符串连接起来呢,如下面的代码所示? template <class T> constexpr const char * get_arithmetic_size() { switch (sizeof(T)) { case 1: return "1"; case 2: return "2"; case 4: return "4"; case 8: return "8"; case 16: return "16"; default: static_assert(dependent_false_v<T>); } } template <class T> constexpr std::enable_if_t<std::is_arithmetic_v<T>, const char *> make_type_name() { const char * …
12 c++  c++17 

1
模板类中的C ++ 20类外定义
直到C ++的C ++ 20标准,当我们想定义一个使用模板类的一些私有成员的类外运算符时,我们将使用类似于以下的构造: template <typename T> class Foo; template <typename T> constexpr bool operator==(T lhs, const Foo<T>& rhs); template <typename T> class Foo { public: constexpr Foo(T k) : mK(k) {} constexpr friend bool operator==<T>(T lhs, const Foo& rhs); private: T mK; }; template <typename T> constexpr bool operator==(T …
12 c++  templates  c++20 

1
原始static_vector实现中可能的未定义行为
tl;博士:我认为我的static_vector具有未定义的行为,但我找不到它。 这个问题是在Microsoft Visual C ++ 17上实现的。我有一个简单而未完成的static_vector实现,即一个具有固定容量的矢量,可以堆栈分配。这是一个C ++ 17程序,使用std :: aligned_storage和std :: launder。我试图将其归结为以下我认为与该问题相关的部分: template <typename T, size_t NCapacity> class static_vector { public: typedef typename std::remove_cv<T>::type value_type; typedef size_t size_type; typedef T* pointer; typedef const T* const_pointer; typedef T& reference; typedef const T& const_reference; static_vector() noexcept : count() { } ~static_vector() { …

1
标准是否保证无捕获的lambda为空?
我正在寻找一种从模板函数中的其他lambda识别空(无捕获)lambda的方法。我目前正在使用C ++ 17,但我也对C ++ 20的答案感到好奇。 我的代码如下所示: template<typename T> auto func(T lambda) { // The aguments of the lambdas are unknown if constexpr (/* is captureless */) { // do stuff } } C ++标准(17或20)是否保证可转换为函数指针的不可捕获lambda也会使std::is_emptyyield 变为true? 以以下代码为例: auto a = []{}; // captureless auto b = [c = 'z']{}; // has …
12 c++  lambda  c++17  c++20 

1
是什么防止班级中相邻成员的重叠?
考虑以下三个struct: class blub { int i; char c; blub(const blub&) {} }; class blob { char s; blob(const blob&) {} }; struct bla { blub b0; blob b1; }; 在int4字节的典型平台上,大小,对齐方式和总填充1如下: struct size alignment padding -------- ------ ----------- --------- blub 8 4 3 blob 1 1 0 bla 12 4 6 …

1
Linux软件包管理器将如何处理C ++ 20模块?
我们到了2020年,C ++ 20以及期待已久的C ++模块功能将面世。但是,在观看了有关CppCon的一些讨论之后,我发现C ++模块处在一个奇怪的地方,特别是对于Linux软件包管理器(pacman,apt,emerge等)。 据我了解,C ++模块是 依赖编译器 您不能在Clang中使用GCC构建的模块 GCC 9.1模块在GCC 9.2上不起作用 同一模块可以有许多不同版本 只要它们不导出到相同的作用域 如果依赖关系更新,则需要重建模块 我的问题是,在所有发行发行版的发行版中,编译器一直都在更新,并且用户可能拥有自己的编译器版本。目前,人们可以只更新编译器,也可以更新libstdc++。但是对于模块,似乎建议libstdc++必须在编译器更新时进行更新。 当编译器更新时,包管理器将如何处理更新,例如STL?我认为为编译器的每个版本构建STL模块的每个版本都是不可行的。用户也不必构建自己的STL模块是一个好主意。

2
为什么这里的枚举变量是右值?
例: typedef enum Color { RED, GREEN, BLUE } Color; void func(unsigned int& num) { num++; } int main() { Color clr = RED; func(clr); return 0; } 编译时出现以下错误: <source>: In function 'int main()': <source>:16:9: error: cannot bind non-const lvalue reference of type 'unsigned int&' to an rvalue of type …

1
非公共类型的公共别名
我想知道它是否有效的C ++: class Test { struct PrivateInner { PrivateInner(std::string const &str) { std::cout << str << "\n"; } }; public: using PublicInner = PrivateInner; }; //Test::PrivateInner priv("Hello world"); // Ok, private so we can't use that Test::PublicInner publ("Hello World"); // ?, by using public alias we can access private type, …

1
无法在函数定义的类外声明符中完全限定类名
该程序导致不希望的贪婪解析的死胡同: struct float4x4 {}; class C { float4x4 M(); }; float4x4 ::C::M() { return float4x4{}; } :8:1:错误:'float4x4'中没有名为'C'的成员; 您的意思仅仅是“ C”吗? float4x4 :: C :: M() ^ ~~~~~~~~~~~~ 可以使用尾随返回类型“固定”: auto ::C::M() -> float4x4 {} 现在一切都好。 因此,我认为在使用heading-return-type声明符语法时,我们不能完全限定类名吗?

2
将概念传递给功能
由于将概念定义为编译时谓词,是否还可以将这些谓词实际重用于编译时算法?例如,可以检查元组中的所有类型是否都符合概念?据我所知,不可能以任何方式将概念传递给函数,这使我重新回到在这些情况下使用模板。 #include <type_traits> template<typename T> concept FloatLike = std::is_same_v<T, float>; struct IsFloat { template<typename U> constexpr static bool test() { return FloatLike<U>; } }; template<typename Predicate, typename... T> constexpr bool all_types() { return (Predicate::template test<T>() && ...); } int main() { static_assert(all_types<IsFloat, float, float>()); static_assert(!all_types<IsFloat, float, int>()); } 我想做的就是这样,所以我不必一直包装这个概念就可以使用它: template<concept …

5
有序数的有效稳定和
我有很长的浮点正数列表(std::vector<float>,大小〜1000)。数字以降序排序。如果我按照以下顺序对它们求和: for (auto v : vec) { sum += v; } 我猜我可能会遇到一些数值稳定性问题,因为接近向量的结尾sum将比更大v。最简单的解决方案是以相反的顺序遍历向量。我的问题是:既有效率又有前瞻性吗?我会丢失更多的缓存吗? 还有其他智能解决方案吗?

2
原子向量的初始化
考虑: void foo() { std::vector<std::atomic<int>> foo(10); ... } foo的内容现在有效吗?还是我需要显式循环并初始化它们?我检查了Godbolt,它看起来还不错,但是在这一点上,该标准似乎很混乱。 所述的std ::矢量构造器表示,它插入默认插入的实例std::atomic<int>,这是初始化值经由放置new。 我认为这种价值初始化的效果适用: 2)如果T是具有默认构造函数的类类型,该构造函数既不是用户提供也不是未删除的(也就是说,它可能是带有隐式定义或默认默认构造函数的类),则将该对象初始化为零,然后将其如果具有非平凡的默认构造函数,则默认初始化; 因此在我看来,原子是零初始化的。所以问题是,是否std::atomic<int>在有效对象中对结果进行零初始化? 我猜答案是“在实践中是,但没有真正定义”? 注意:此答案同意它是零初始化的,但是并没有真正说明是否意味着该对象有效。
12 c++  vector  atomic 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.