Questions tagged «c++11»

将此标记用于必须作为C ++ 11编译的代码(不使用C ++ 14或更高版本中引入的任何功能)。


5
如何在Lambda本身中获取C ++ Lambda函数的地址?
我试图弄清楚如何获取自身内部的lambda函数的地址。这是一个示例代码: []() { std::cout << "Address of this lambda function is => " << ???? }(); 我知道我可以在变量中捕获lambda并打印地址,但是我想在执行此匿名函数时就地执行该操作。 有没有更简单的方法?
53 c++  c++11  lambda  c++14  c++17 

3
C ++十进制类型和括号-为什么?
之前已经讨论 过该主题,但这不是重复的。 当有人询问decltype(a)和之间的区别时decltype((a)),通常的答案是- a是变量,(a)是表达式。我觉得这个答案不令人满意。 首先,a也是一个表达。主表达式的选项包括: (表情) id表达 更重要的是,decltype的措词非常非常明确地考虑了括号: For an expression e, the type denoted by decltype(e) is defined as follows: (1.1) if e is an unparenthesized id-expression naming a structured binding, ... (1.2) otherwise, if e is an unparenthesized id-expression naming a non-type template-parameter, ... (1.3) otherwise, if e …

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 

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


3
Lambda函数可变捕获从引用到全局变量的行为差异
我发现如果我使用lambda使用mutable关键字捕获对全局变量的引用,然后修改lambda函数中的值,则结果在编译器之间是不同的。 #include <stdio.h> #include <functional> int n = 100; std::function<int()> f() { int &m = n; return [m] () mutable -> int { m += 123; return m; }; } int main() { int x = n; int y = f()(); int z = n; printf("%d %d %d\n", x, y, …

2
实际上,一个<random>随机数引擎中应该使用哪个?std :: mt19937?
假设您想&lt;random&gt;在实际程序中使用C ++ 工具(对于“实际”的某些定义-这里的约束是该问题的一部分)。您的代码大致如下: int main(int argc, char **argv) { int seed = get_user_provided_seed_value(argc, argv); if (seed == 0) seed = std::random_device()(); ENGINE g(seed); // TODO: proper seeding? go_on_and_use(g); } 我的问题是,您应该使用哪种类型ENGINE? 我以前经常说std::mt19937,是因为它可以快速键入并具有名称识别功能。但是这些天来,似乎每个人都在说 Mersenne Twister非常重且对缓存不友好,甚至没有通过其他人所做的所有统计测试。 我想说,std::default_random_engine因为这是显而易见的“默认值”。但是我不知道它在平台之间是否有所不同,并且我也不知道它在统计上是否有好处。 既然如今每个人都在64位平台上,我们至少应该使用std::mt19937_64over std::mt19937吗? 我想说pcg64还是xoroshiro128因为它们看起来受人尊敬且轻巧,但它们根本不存在&lt;random&gt;。 我不知道什么minstd_rand,minstd_rand0,ranlux24,knuth_b,等-当然,他们一定是好东西? 显然,这里存在一些竞争约束。 发动机强度。(&lt;random&gt;没有加密强度高的PRNG,但是,某些标准化的PRNG比其他的“弱”,对吧?) sizeof 引擎。 其速度operator()。 易于播种。mt19937众所周知,很难正确地植入种子,因为它有太多的状态要初始化。 库供应商之间的可移植性。如果一个供应商提供的foo_engine编号与另一供应商提供的编号不同foo_engine,则对某些应用程序不利。(希望这不排除任何可能,除非default_random_engine。) 尽可能权衡所有这些限制,您将说出最终的“最佳实践留在标准库中”的答案是什么?我应该继续使用std::mt19937还是什么?
21 c++  c++11  random 

4
如何调用模板类型的正确构造函数?
在以下代码中,如何使注释行与其上方的行一样工作? 我想将其设为通用代码,以调用合适的template构造函数Type。 #include &lt;string&gt; #include &lt;iostream&gt; template &lt;typename Type&gt; struct Class { Type data; Class(Type data) : data(data) { } }; int main() { Class&lt;std::string&gt; a = std::string("abc"); // Class&lt;std::string&gt; b = "abc"; std::cout &lt;&lt; a.data &lt;&lt; std::endl; return 0; }

4
连续枚举C ++ 11
有没有一种方法可以在C ++ 11中检查枚举是否连续? 给出一个不是的枚举值是完全有效的。在C ++ 14,C ++ 17或C ++ 20中是否可能有类似类型特征的功能来检查枚举是否连续?这将在static_assert中使用。 一个小例子如下: enum class Types_Discontinuous { A = 10, B = 1, C = 100 }; enum class Types_Continuous { A = 0, B = 1, C = 2 }; static_assert(SOME_TEST&lt;Types_Discontinuous&gt;::value, "Enum should be continuous"); // Fails static_assert(SOME_TEST&lt;Types_Continuous&gt;::value, "Enum should be …
17 c++  c++11  c++14  c++17  c++20 

2
这是旧的C ++样式构造函数吗?
这里是一段C ++代码。 在此示例中,许多代码块看起来像构造函数调用。不幸的是,第3块代码不是(您可以使用https://godbolt.org/z/q3rsxn和https://cppinsights.io进行检查)。 我认为,这是一种古老的C ++表示法,它可以解释使用{}(参见#4)引入新的C ++ 11构造表示法的方法。 您是否有T(i)含义的解释,如此接近构造函数表示法,但绝对不同? struct T { T() { } T(int i) { } }; int main() { int i = 42; { // #1 T t(i); // new T named t using int ctor } { // #2 T t = T(i); // new T …
17 c++  c++11 

3
可变参数模板:组中展开参数
我有一个带有两个参数的函数: template &lt;typename T1, typename T2&gt; void foo(T1 arg1, T2 arg2) { std::cout &lt;&lt; arg1 &lt;&lt; " + " &lt;&lt; arg2 &lt;&lt; '\n'; } 一个可变参数的参数应该成对转发: template &lt;typename... Args&gt; void bar(Args&amp;&amp;... args) { static_assert(sizeof...(Args) % 2 == 0); ( foo( std::forward&lt;Args&gt;(args), std::forward&lt;Args&gt;(args) ), ... ); // ^ Sends each argument twice, …

2
为什么C ++ 20之前std :: swap没有标记为constexpr?
在C ++ 20中,std::swap成为一个constexpr函数。 我知道标准库在标记事物方面确实落后于该语言constexpr,但是到了2017年,&lt;algorithm&gt;它和许多其他事物一样已经成为constexpr了。但是- std::swap不是。我隐约记得有一些奇怪的语言缺陷阻止了这种标记,但是我忘记了细节。 有人可以简洁明了地解释吗? 动机:需要理解为什么在C ++ 11 / C ++ 14代码中标记std::swap()类似函数的想法可能不是一个好主意constexpr。

3
在两个范围内以降序对向量排序
假设我有一个整数向量: std::vector&lt;int&gt; indices; for (int i=0; i&lt;15; i++) indices.push_back(i); 然后我按降序对其进行排序: sort(indices.begin(), indices.end(), [](int first, int second) -&gt; bool{return indices[first] &gt; indices[second];}) for (int i=0; i&lt;15; i++) printf("%i\n", indices[i]); 这将产生以下结果: 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 现在,我想将数字3、4、5和6移到末尾,并保持它们的降序(最好不必sort第二次使用)。即,这就是我想要的: 14 13 12 11 10 …

1
我可以通过元素的完美转发来列表初始化std :: vector吗?
我注意到std :: vector的聚合 列表初始化在以下情况下执行复制初始化移动更适用。同时,多个emplace_backs可以满足我的需求。 我只能提出编写模板函数的不完善解决方案init_emplace_vector。但是,它仅对非显式单值构造函数最佳。 template &lt;typename T, typename... Args&gt; std::vector&lt;T&gt; init_emplace_vector(Args&amp;&amp;... args) { std::vector&lt;T&gt; vec; vec.reserve(sizeof...(Args)); // by suggestion from user: eerorika (vec.emplace_back(std::forward&lt;Args&gt;(args)), ...); // C++17 return vec; } 题 我真的需要使用emplace_back来尽可能高效地初始化std :: vector吗? // an integer passed to large is actually the size of the resource std::vector&lt;large&gt; v_init { …

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.