Questions tagged «c++»

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

4
用C和C ++调用的(…)是什么?
的用途之一...是表示可变参数 C和C ++中的实体。 它叫什么名字? 以这种方式使用时,它被归类为运算符还是其他? 还有其他细节...吗? 编辑: 我知道的目的...。我在问它的​​名称和分类,我希望它在C和C ++中都相似。

6
使用std :: vector :: swap方法在C ++中交换两个不同的向量是否安全?
假设您具有以下代码: #include <iostream> #include <string> #include <vector> int main() { std::vector<std::string> First{"example", "second" , "C++" , "Hello world" }; std::vector<std::string> Second{"Hello"}; First.swap(Second); for(auto a : Second) std::cout << a << "\n"; return 0; } 假设向量不是std::string,但是类: std::vector<Widget> WidgetVector; std::vector<Widget2> Widget2Vector; 用该std::vector::swap方法交换两个向量是否仍然安全:WidgetVector.swap(Widget2Vector);否则将导致UB?
30 c++  c++11  vector  stdvector  swap 

4
使用未初始化的成员复制结构
复制一个未初始化其成员的结构是否有效? 我怀疑这是未定义的行为,但如果是这样,则会使任何未初始化的成员保留在结构中(即使从未直接使用这些成员)也很危险。所以我想知道标准中是否有允许它的东西。 例如,这有效吗? struct Data { int a, b; }; int main() { Data data; data.a = 5; Data data2 = data; }

2
为什么`std :: string :: find()`在失败时不返回结束迭代器?
我发现的行为std::string::find与标准C ++容器不一致。 例如 std::map<int, int> myMap = {{1, 2}}; auto it = myMap.find(10); // it == myMap.end() 但是对于一串, std::string myStr = "hello"; auto it = myStr.find('!'); // it == std::string::npos 为什么不应该失败的myStr.find('!')回报myStr.end(),而不是std::string::npos? 由于std::string与其他容器相比,它有些特殊,所以我想知道这背后是否有真正的原因。(令人惊讶的是,我找不到任何人在任何地方对此进行质疑)。

2
为什么不能保证std :: hash具有确定性?
此后,我们使用N4140(C ++ 14标准)。 根据第17.6.3.4节哈希要求, 返回的值应仅取决于k 程序持续时间内的参数。 [注意:因此,对于给定的程序执行,h(k)具有相同值的表达式的所有求值都会 k产生相同的结果。—尾注] 和§12年9月20日类模板哈希说 ... 实例hash<Key>应: (1.1)-满足哈希要求(17.6.3.4)... (1.2)-... 这意味着,如果重新启动程序,则哈希值value(即hash<decltype(value)>(value))可能采用不同的值。 但为什么?此限制不在C ++ 11标准中,而是在C ++ 14,C ++ 17和C ++ 20标准中。作为用户(不是STL开发人员),如果std::hash具有确定性,那将非常有用。实现确定性哈希函数有任何数学困难吗?但是我们日常使用的哈希函数(例如,不建议使用md5sum或更安全的函数sha256)都是确定性的。有效率问题吗?

1
回顾C ++编译时间计数器
TL; DR 在尝试阅读整篇文章之前,请了解: 我自己已经找到解决所提出问题的方法,但是我仍然很想知道分析是否正确; 我已经将解决​​方案打包到一个fameta::counter类中,该类可以解决一些剩余的怪癖。您可以在github上找到它; 您可以在使用Godbolt上看到它。 一切如何开始 自从FilipRoséen在2015年发现/发明以来,编译计时器的黑魔法就用C ++了,我一直对这个设备有些痴迷,所以当CWG 决定必须取消功能时,我很失望,但仍然希望他们的想法通过向他们展示一些引人注目的用例可以对其进行更改。 然后,几年前,我决定再次研究一下问题,以便将uberswitch es嵌套(在我看来,这是一个有趣的用例),只是发现它不再适用于新版本的。可用的编译器,即使问题2118处于(并且仍然)处于打开状态:代码可以编译,但计数器不会增加。 在Roséen的网站上已经报告了该问题,最近在stackoverflow上也报告了该问题:C ++是否支持编译时计数器? 几天前,我决定再次尝试解决问题 我想了解编译器中发生了什么变化,这些变化使看似仍然有效的C ++不再起作用。为此,我在互联网上进行了广泛的搜索,寻找有人对此进行讨论,但无济于事。因此,我开始进行实验并得出一些结论,我在这里提出的想法是希望从这里得到比我自己更了解的反馈。 为了清楚起见,下面我将介绍Roséen的原始代码。有关其工作原理的说明,请访问他的网站: template<int N> struct flag { friend constexpr int adl_flag (flag<N>); }; template<int N> struct writer { friend constexpr int adl_flag (flag<N>) { return N; } static constexpr int value = N; }; …

1
类无法访问其自己的私有静态constexpr方法-lang虫?
这段代码不能在Clang(6,7,8,9,trunk)中进行编译,但是在GCC(7.1、8.1、9.1)中可以很好地进行编译: template<class T> struct TypeHolder { using type = T; }; template<int i> class Outer { private: template<class T> static constexpr auto compute_type() { if constexpr (i == 42) { return TypeHolder<bool>{}; } else { return TypeHolder<T>{}; } } public: template<class T> using TheType = typename decltype(Outer<i>::compute_type<T>())::type; }; int main() …

2
为什么我的班级不是默认可构造的?
我有那些课: #include <type_traits> template <typename T> class A { public: static_assert(std::is_default_constructible_v<T>); }; struct B { struct C { int i = 0; }; A<C> a_m; }; int main() { A<B::C> a; } 编译时a_m不是默认可构造的,而是a可以构造的。 更改C为: struct C { int i; }; 一切安好。 使用Clang 9.0.0测试。
28 c++ 

1
为什么在C ++中,如果数字为常数,则static_cast <unsigned>为负数会有所不同
等于equal是false的C ++规则是什么?鉴于: float f {-1.0}; bool equal = (static_cast&lt;unsigned&gt;(f) == static_cast&lt;unsigned&gt;(-1.0)); 例如https://godbolt.org/z/fcmx2P #include &lt;iostream&gt; int main() { float f {-1.0}; const float cf {-1.0}; std::cout &lt;&lt; std::hex; std::cout &lt;&lt; " f" &lt;&lt; "=" &lt;&lt; static_cast&lt;unsigned&gt;(f) &lt;&lt; '\n'; std::cout &lt;&lt; "cf" &lt;&lt; "=" &lt;&lt; static_cast&lt;unsigned&gt;(cf) &lt;&lt; '\n'; return 0; } 产生以下输出: …
28 c++  casting 

3
为什么选择这种转换运算符的重载?
考虑下面的代码。 struct any { template &lt;typename T&gt; operator T &amp;&amp;() const; template &lt;typename T&gt; operator T &amp;() const; }; int main() { int a = any{}; } 此处,第二个转换运算符由过载分辨率选择。为什么? 据我了解,这两个运算符分别推导为operator int &amp;&amp;() const和operator int &amp;() const。两者都在可行的功能集中。通读[over.match.best]并没有帮助我弄清楚为什么后者更好。 为什么后一种功能比前一种更好?

2
当lambda捕获“ ​​this”时,是否必须明确使用它?
我发现this在lambda 中捕获的示例显式使用了它。例如: capturecomplete = [this](){this-&gt;calstage1done();}; 但是似乎也可以隐式使用它。例如: capturecomplete = [this](){calstage1done();}; 我在g ++中对此进行了测试,并对其进行了编译。 这是标准的C ++吗?(如果可以,是哪个版本),还是某种扩展形式?

2
为什么使用分类组的分组求和要比未分类组慢?
我有两列制表符分隔的整数,第一列是随机整数,第二列是标识组的整数,可以通过此程序生成该整数。(generate_groups.cc) #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;ctime&gt; int main(int argc, char* argv[]) { int num_values = atoi(argv[1]); int num_groups = atoi(argv[2]); int group_size = num_values / num_groups; int group = -1; std::srand(42); for (int i = 0; i &lt; num_values; ++i) { if (i % group_size == 0) { ++group; …
27 c++  performance 

3
如何防止C ++猜测第二个模板参数?
我正在使用C ++库( strf),该某个位置具有以下代码: namespace strf { template &lt;typename ForwardIt&gt; inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ } template &lt;typename Range, typename CharT&gt; inline auto range(const Range&amp; range, const CharT* sep) { /* ... */ } } 现在,我想使用 strf::range&lt;const char*&gt;(some_char_ptr, some_char_ptr + some_length)在我的代码中。但是,如果这样做,我将收到以下错误(使用CUDA 10.1的NVCC): error: more than one …

3
是否可以通过const引用返回默认参数的值?
是否可以通过const引用返回默认参数的值,如以下示例所示: https://coliru.stacked-crooked.com/a/ff76e060a007723b #include &lt;string&gt; const std::string&amp; foo(const std::string&amp; s = std::string("")) { return s; } int main() { const std::string&amp; s1 = foo(); std::string s2 = foo(); const std::string&amp; s3 = foo("s"); std::string s4 = foo("s"); }

2
std :: pair中的初始化列表
这段代码: #include &lt;iostream&gt; #include &lt;string&gt; std::pair&lt;std::initializer_list&lt;std::string&gt;, int&gt; groups{ { "A", "B" }, 0 }; int main() { for (const auto&amp; i : groups.first) { std::cout &lt;&lt; i &lt;&lt; '\n'; } return 0; } 编译但返回段错误。为什么? 在gcc 8.3.0和在线编译器上进行了测试。
26 c++  std  std-pair 

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.