Questions tagged «c++11»

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

3
将派生类的unique_ptr用作将unique_ptr用作基类的函数的参数
我正在尝试unique_ptr在将aunique_ptr用作基类的函数中使用to派生类。就像是: class Base {}; class Derived : public Base {}; void f(unique_ptr<Base> const &base) {} … unique_ptr<Derived> derived = unique_ptr<Derived>(new Derived); f(derived); 如果我正确理解此答案,则此代码应该可以工作,但是会导致以下编译错误: 错误C2664:'f':无法将参数1从'std :: unique_ptr <_Ty>'转换为'const std :: unique_ptr <_Ty>&' IntelliSense:不存在从“ std :: unique_ptr <派生,std :: default_delete <派生>>”到“ const std :: unique_ptr <基本,std :: default_delete <基本>>”的合适的用户定义转换 如果我更改f为take unique_ptr<Derived> const …



2
从构造函数抛出后调用析构函数
我曾经认为在C ++中,如果构造函数引发异常,则不会调用此“部分构造”类的析构函数。 但是似乎在C ++ 11中不再是这样:我使用g ++编译了以下代码,并将其打印X destructor到控制台。为什么是这样? #include <exception> #include <iostream> #include <stdexcept> using namespace std; class X { public: X() : X(10) { throw runtime_error("Exception thrown in X::X()"); } X(int a) { cout << "X::X(" << a << ")" << endl; } ~X() { cout << "X destructor" << …
73 c++  exception  c++11 

8
将std :: __ cxx11 :: string转换为std :: string
我使用c ++ 11,但也使用一些未配置的库,并且需要某种类型转换。特别是,我需要一种转换std::__cxx11::string为常规的方法std::string,但是谷歌搜索找不到这样做的方法,因此放在(string)前面是行不通的。 如果不进行转换,则会出现如下链接错误: undefined reference to `H5::CompType::insertMember(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, H5::DataType const&) const'
73 c++  string  c++11  types  std 

7
按值传递vs按右值引用传递
我何时应该将函数声明为: void foo(Widget w); 相对于 void foo(Widget&& w);? 假设这是唯一的重载(例如,我选择一个或另一个,而不是两个,也没有其他重载)。不涉及模板。假设该功能foo需要拥有Widget(例如const Widget&,这不是本讨论的一部分)。在这些情况范围之外,我对任何答案都不感兴趣。有关为什么这些约束是问题的一部分,请参见文章末尾的附录。 我和我的同事可以想到的主要区别是,右值引用参数迫使您对副本明确。调用方负责制作显式副本,然后在std::move需要复制时将其传递给它。在按值传递的情况下,副本的成本被隐藏: //If foo is a pass by value function, calling + making a copy: Widget x{}; foo(x); //Implicit copy //Not shown: continues to use x locally //If foo is a pass by rvalue reference function, calling + making a copy: …
72 c++  c++11  c++14 

3
为什么在std :: atomic中使用了volatile限定符?
从我从Herb Sutter和其他人那里读到的内容来看volatile,至少在C / C ++方面,您会认为并发编程是完全正交的概念。 但是,在GCC实现中,所有std::atomic的成员函数都具有volatile限定符。在Anthony Williams的实现中也是如此std::atomic。 那怎么办,我的atomic<>变量是否需要volatile?
72 c++  c++11  atomic  volatile 

4
在C ++ 11中string :: c_str()不再为null终止吗?
在C ++ 11中,basic_string::c_str它定义为与完全相同basic_string::data,而后者又定义为*(begin() + n)与和*(&*begin() + n)(when 0 <= n < size())完全相同。 我找不到任何要求字符串末尾始终包含空字符的内容。 这是否意味着c_str()不再保证会产生以null结尾的字符串?
72 c++  string  c++11 

1
将libstdc ++编译的库与clang ++ -stdlib = libc ++一起使用
我在Mac OS X(10.8.2)下使用C ++进行工作,最近我提出了使用C ++ 11功能的需求,这些功能可以通过使用libc ++ stdlib的clang ++编译器获得。但是,我还需要使用一些针对libstdc ++编译并链接的旧式库(来自MacPorts)。 这样做时,我遇到了链接错误,因为使用(例如)的遗留库的标头std::string需要针对std::__1::basic_string(即libc ++实现std::string)而不是针对std::basic_string实现进行解析。 有没有办法在开发中混合这两个库(例如,通过使用一些预处理器标志?)
72 c++  c++11  clang  libstdc++  libc++ 

8
使用std :: string作为缓冲区有不利之处吗?
我最近看到我的一位同事std::string用作缓冲区: std::string receive_data(const Receiver& receiver) { std::string buff; int size = receiver.size(); if (size > 0) { buff.resize(size); const char* dst_ptr = buff.data(); const char* src_ptr = receiver.data(); memcpy((char*) dst_ptr, src_ptr, size); } return buff; } 我猜这家伙想利用返回字符串的自动销毁功能,因此他不必担心释放分配的缓冲区。 这对我来说有点奇怪,因为根据cplusplus.com,该data()方法返回const char*指向由字符串内部管理的缓冲区的指针: const char* data() const noexcept; Memcpying到一个const char指针?AFAIK只要知道我们所做的事情就不会造成伤害,但是我错过了什么吗?这很危险吗?
72 c++  c++11  stdstring 

10
使用std :: vector作为原始内存的视图
我正在使用一个外部库,该库有时会给我一个指向整数和大小数组的原始指针。 现在,我想std::vector用来访问和修改这些值,而不是使用原始指针访问它们。 这是一个解释这一点的人工示例: size_t size = 0; int * data = get_data_from_library(size); // raw data from library {5,3,2,1,4}, size gets filled in std::vector<int> v = ????; // pseudo vector to be used to access the raw data std::sort(v.begin(), v.end()); // sort raw data in place for (int i = 0; …
71 c++  c++11  vector  stdvector 

2
C ++ 11初始化程序列表失败-但仅在长度为2的列表上
我找到了一个模糊的日志记录错误,发现长度为2的初始化列表似乎是特例!这怎么可能? 该代码是使用Apple LLVM 5.1版(clang-503.0.40)编译的CXXFLAGS=-std=c++11 -stdlib=libc++。 #include <stdio.h> #include <string> #include <vector> using namespace std; typedef vector<string> Strings; void print(string const& s) { printf(s.c_str()); printf("\n"); } void print(Strings const& ss, string const& name) { print("Test " + name); print("Number of strings: " + to_string(ss.size())); for (auto& s: ss) { auto t …

3
用g ++编译的奇怪代码
以下代码使用g ++ 4.8.1成功编译: int main() { int(*)(); } 它看起来像一个简单的函数指针声明: int(*f)(); 它不能与clang 3.4和vc ++ 2013一起编译。 是编译器错误还是标准的暗处之一? 使用g ++ 4.8.1可以正常编译的类似奇怪代码片段的列表(已更新): int(*)(); int(*); int(*){}; int(*()); 这些奇怪代码片段的现场示例。 更新1: @Ali在注释中添加了一些有趣的信息: 所有4种情况均使用clang 3.5干线(202594)给出了编译错误,并且使用gcc 4.9干线(20140302)进行了编译。的行为与相同-std=c++98 -pedantic,但int(*){};可以理解的除外。扩展的初始化程序列表仅适用于-std=c++11。 更新2:正如@CantChooseUsernames在他的回答中指出的那样,即使没有初始化,它们仍然可以正常编译,即使没有启用任何优化,g ++也不会为它们生成任何汇编(既没有初始化也没有初始化): int(*)() = 0; int(*) = 0; int(*){} = 0; int(*()) = 0; 带有初始化的实时示例。 更新3:令我惊讶的是int(*)() = "Hello, world!";,它也int(*p)() = "Hello, …
71 c++  gcc  c++11  g++ 

2
在C ++ 11基于范围的循环中使用OpenMP吗?
是否有任何反指示?还是行为明确? #pragma omp parallel for for(auto x : stl_container) { ... } 因为似乎OpenMP规范仅对c ++ 98有效,但我想由于C ++ 11线程可能存在更多不兼容问题,这里不使用它们。我还是想确定。
71 c++11  openmp 

6
如何在不使用<mutex>的情况下在C ++ 11中实现多线程安全单例
既然C ++ 11具有多线程功能,我想知道在不使用互斥对象的情况下实现延迟初始化单例的正确方法是什么(出于性能原因)。我想到了这一点,但是tbh Im并不太擅长编写无锁代码,因此Im正在寻找更好的解决方案。 // ConsoleApplication1.cpp : Defines the entry point for the console application. // # include &lt;atomic&gt; # include &lt;thread&gt; # include &lt;string&gt; # include &lt;iostream&gt; using namespace std; class Singleton { public: Singleton() { } static bool isInitialized() { return (flag==2); } static bool initizalize(const string&amp; name_) …

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.