Questions tagged «c++11»

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


6
可变参数模板包扩展
我正在尝试学习可变参数的模板和功能。我不明白为什么这段代码无法编译: template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); } int main() { foo2(1, 2, 3, "3"); return 0; } 当我编译它失败并出现错误: 错误C3520:“ args”:必须在这种情况下扩展参数包 (在功能上foo2)。


6
如何使用CMake检测编译器的C ++ 11支持
是否有一种方法可以让CMake自动检测是否编译器支持C ++ 11? 最好在CMake运行期间通知用户代码将不会编译,因为编译器不支持C ++ 11。目前,我设置了C ++ 11标志。但是,如果编译器不支持它,则用户会在CMake运行期间收到编译错误,而不是错误。 完美的东西就像find_package()。但是,我没有找到任何提供所需功能的模块或功能。 此外,最好具有检测编译器是否需要标志std=c++0x或的功能std=c++11。 是否有可用的东西,或者我需要自己开发? 下面是我到目前为止使用的一些代码,但是它仅适用于GNU'c GCC编译器。如果有一个更通用的解决方案,那将是很好的。 if(CMAKE_COMPILER_IS_GNUCXX) execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) if (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7) message(STATUS "C++11 activated.") add_definitions("-std=gnu++11") elseif(GCC_VERSION VERSION_GREATER 4.3 OR GCC_VERSION VERSION_EQUAL 4.3) message(WARNING "C++0x activated. If you get any errors update to a compiler …
78 c++  c++11  cmake 

4
C ++如何将std :: chrono :: time_point转换为long并返回
我需要转换std::chrono::time_point,并从一个long类型(整数64位)。我开始与std::chrono... 这是我的代码: int main () { std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now(); auto epoch = now.time_since_epoch(); auto value = std::chrono::duration_cast<std::chrono::milliseconds>(epoch); long duration = value.count(); std::chrono::duration<long> dur(duration); std::chrono::time_point<std::chrono::system_clock> dt(dur); if (dt != now) std::cout << "Failure." << std::endl; else std::cout << "Success." << std::endl; } 该代码可以编译,但不会显示成功。 为什么与结尾dt不同now? 该代码缺少什么?
78 c++  c++11  chrono 

5
在任何情况下,返回RValue引用(&&)都是有用的吗?
函数应返回RValue引用吗?一种技术,技巧,成语或模式? MyClass&& func( ... ); 我知道一般会返回引用的危险,但是有时候我们还是这样做,不是吗?T& T::operator=(T)只是一个惯用的例子。但是T&& func(...)呢?有没有一般的地方可以从中受益呢?与仅编写客户端代码相比,编写库或API代码时可能有所不同吗?

4
如何在C ++中的UTF-8上正确使用std :: string?
我的平台是Mac和C ++ 11(或更高版本)。我是C ++的初学者,致力于处理中文和英文的个人项目。UTF-8是此项目的首选编码。 我读了一些有关Stack Overflow的文章,其中许多文章建议std::string在处理UTF-8时使用,并避免使用UTF-8,wchar_t因为目前没有char8_tUTF-8。 然而,他们没有谈论如何正确地与像函数处理str[i],std::string::size(),std::string::find_first_of()或者std::regex因为这些功能通常面临UTF-8时,返回意外的结果。 我应该继续std::string还是切换到std::wstring?如果我应该std::string坚持下去,那么解决上述问题的最佳实践是什么?
78 c++  string  c++11 


4
c ++ 11 regex比python慢
嗨,我想了解为什么下面的代码使用正则表达式进行拆分字符串拆分 #include<regex> #include<vector> #include<string> std::vector<std::string> split(const std::string &s){ static const std::regex rsplit(" +"); auto rit = std::sregex_token_iterator(s.begin(), s.end(), rsplit, -1); auto rend = std::sregex_token_iterator(); auto res = std::vector<std::string>(rit, rend); return res; } int main(){ for(auto i=0; i< 10000; ++i) split("a b c", " "); return 0; } 则慢于以下python代码 import re …

5
如何对可变参数模板函数的异构参数包进行通用计算?
前提: 在使用了可变参数模板后,我意识到,要完成琐碎的元编程任务之外的任何事情,很快就会变得很麻烦。特别是,我发现自己希望的执行方式上的参数包一般操作如迭代,拆分,循环在一个std::for_each样的方式,等等。 在观看了C ++和Beyond 2012的Andrei Alexandrescu的关于static ifC ++(从D编程语言中借用的结构)的可取性的演讲之后,我感到有些东西static for也将派上用场-我感到更多这样的static结构可以带来利益。 于是我开始想知道如果有一种方法来实现这样的一个可变参数模板函数的参数包(伪代码): template<typename... Ts> void my_function(Ts&&... args) { static for (int i = 0; i < sizeof...(args); i++) // PSEUDO-CODE! { foo(nth_value_of<i>(args)); } } 它将在编译时转换为如下形式: template<typename... Ts> void my_function(Ts&&... args) { foo(nth_value_of<0>(args)); foo(nth_value_of<1>(args)); // ... foo(nth_value_of<sizeof...(args) - 1>(args)); } 原则上,static_for将允许进行更精细的处理: template<typename... Ts> …

7
不能将枚举类用作unordered_map键
我有一个包含枚举类的类。 class Shader { public: enum class Type { Vertex = GL_VERTEX_SHADER, Geometry = GL_GEOMETRY_SHADER, Fragment = GL_FRAGMENT_SHADER }; //... 然后,当我在另一个类中实现以下代码时... std::unordered_map<Shader::Type, Shader> shaders; ...我得到一个编译错误。 ...usr/lib/c++/v1/type_traits:770:38: Implicit instantiation of undefined template 'std::__1::hash<Shader::Type>' 这是什么导致错误?
77 c++  c++11  map  enums  enum-class 

1
C ++ 11 auto:如果得到一个常量引用怎么办?
请看下面的简单代码: class Foo { public: Foo(){} ~Foo(){} Foo(const Foo&){} Foo& operator=(const Foo&) { return *this; } }; static Foo g_temp; const Foo& GetFoo() { return g_temp; } 我试图这样使用auto: auto my_foo = GetFoo(); 我希望这my_foo将是对的常量引用Foo,这是函数的返回类型。但是,类型auto为Foo,而不是引用。此外,my_foo通过复制创建g_temp。这种行为对我而言并不那么明显。 为了获得对的引用Foo,我需要这样编写: const auto& my_foo2 = GetFoo(); auto& my_foo3 = GetFoo(); 问题:为什么auto推断出GetFoo作为对象而不是引用的返回类型?
77 c++  reference  c++11  auto 

5
为什么官方的Qt示例和教程不使用智能指针?
为什么有关Qt库的官方示例和教程从不使用智能指针?我只看到new和delete用于创建和销毁小部件。 我搜索了基本原理,但找不到它,除非是出于历史原因或向后兼容,否则我自己也看不到:不是每个人都希望程序在小部件构造函数失败时终止,并通过try / catch处理它块是丑陋的(即使在很少的地方使用)。父母小部件可能拥有孩子的所有权这一事实也仅向我部分解释了这一点,因为您仍必须delete在某种程度上为父母使用。
76 c++  qt  c++11 


3
C ++ 11“自动”语义
当我使用C ++ 11时auto,关于类型演绎将解析为值还是引用的规则是什么? 例如,有时很明显: auto i = v.begin(); // Copy, begin() returns an iterator by value 这些不太清楚: const std::shared_ptr<Foo>& get_foo(); auto p = get_foo(); // Copy or reference? static std::shared_ptr<Foo> s_foo; auto sp = s_foo; // Copy or reference? std::vector<std::shared_ptr<Foo>> c; for (auto foo: c) { // Copy for every …
76 c++  c++11 

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.