Tag: c ++ 11

initializer_list vs 2013中的双重删除

今天在我的项目中遇到一个内存问题,用一个使用c ++ 11 initializer_list的类。 系统发出内存问题:dbgdel.cpp中的expression式_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)我把代码简化为一个简单的例子,它不再抛出一个expression式,但是从debugging输出中问题变得明显。代码是正确的,也似乎与g ++的工作。 #include <functional> #include <memory> #include <string> #include <iostream> #include <vector> #include <map> #include <sstream> #include <initializer_list> using namespace std; class B { public: char data[256]; B(const string& x) { cout << "Init " << this << endl; } B(const B& b) { cout << "Copy " << this […]

C ++ 11:基于范围的语句:“range-init”生命周期?

在最新的C ++标准中暗示: for (foo : bar) baz; 等同于: { auto && r = bar; for ( auto it = r.begin(), end = r.end(); it != end; ++it ) { foo = *it; baz; } } 当上面的bar是一个函数调用返回一个集合,例如: vector<string> boo(); 即 for (auto bo : boo()) … 不行: auto&& r = boo(); … 因此,boo()的临时返回值在声明“auto && r = […]

使用`std :: function <void(…)>`来调用非void函数

前一段时间我使用std::function非常像这样: std::function<void(int)> func = [](int i) -> int { return i; }; 基本上,我这样做是因为我想在std::function存储不同的函数对象,但我不想限制这些函数的返回types。 既然这似乎有效,我就跟着去了。 但我不相信这是安全的使用,我一直没能find任何文件。 有谁知道这个用法是否合法? 或者更一般地说,可以安全地分配给std::function的对象的规则是什么? 编辑 澄清,我关心的问题是lambda函数返回一个int ,而func声明返回types为void 。 我不确定这是否行,尤其是一旦调用func() 。

为什么这段代码试图调用复制构造函数?

我只是在Visual Studio中花费了大量的时间来处理错误。 我已经将代码提炼成了下面这个小的可编译的例子,并在IdeOne上试了一下,得到了同样的错误,你可以在这里看到。 我想知道为什么下面的代码尝试调用B(const B&)而不是B(B&&) : #include <iostream> using namespace std; class A { public: A() : data(53) { } A(A&& dying) : data(dying.data) { dying.data = 0; } int data; private: // not implemented, this is a noncopyable class A(const A&); A& operator=(const A&); }; class B : public A { }; int main() […]

使用默认构造函数调用的网格类不工作OpenGL C ++

我为OpenGL 3.3创build了一个Mesh类,当我使用非默认的构造函数创build类时,它可以很好地工作,当我创build对象时创build顶点。 然而,我现在想要有多个对象,我可以通过将它们放在一个向量中dynamic创build,所以我必须添加一个默认的构造函数,我使用相同的函数来设置缓冲区数据,与其他构造函数一样…但它不工作。 就我所知,不是因为它在向量中的事实,而是与构造函数有关,或者是稍后创build缓冲区数据的事情。 我真的不太确定。 这是我的课程。 (当我创build一个可以工作的网格时,我使用参数调用构造函数,当它不起作用时,我构造一个没有参数的网格并调用“changeMes​​h”函数) mesh.h #ifndef MESH_H #define MESH_H #include <iostream> #include <vector> #include <GL/glew.h> #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/type_ptr.hpp> class mesh { public: mesh(); mesh(std::vector<GLfloat> vertices, std::vector<GLuint> triangles, GLuint shaderProgram); ~mesh(); void changeMesh(std::vector<GLfloat> vertices, std::vector<GLuint> triangles, GLuint shaderProgram); void render(); void Translate(glm::vec3 addVector); void Rotate(glm::vec3 rotVector, GLfloat angle); protected: private: […]

失败后,C ++中的istream行为发生变化

从: cppreference 直到C ++ 11: 如果提取失败(例如,如果input的字母是数字所在的位置),值将保持不变,并设置失败位。 由于C ++ 11: 如果提取失败,写入零值并设置失败位。 如果提取的结果是值太大或太小std::numeric_limits<T>::max()适合值,则写入std::numeric_limits<T>::max()或std::numeric_limits<T>::min() ,并设置failbit标志。 由于这个变化,这意味着下面的代码片段: int x = 1; std::cin >> x; return x; 在数值转换失败的情况下,将在C ++ 11之前返回1 ,否则返回0 。 为什么标准委员会会引入这样一个微妙的突破性变革? 或者说,在C ++ 11之前有什么样的代码可以保证这个改变?

为什么我的模板不能接受一个初始化列表

我已经创build了一个模板如下 template<typename T> void f(T const& t) { } 我希望这可以通过容器来调用,也可以通过初始化器列表调用。 我认为这将是initializer_list<int> ,当调用如下。 f({1, 2, 3}); 但GCCperformance得好像不符合标准 m.cpp: In function 'int main()': m.cpp:6:25: warning: deducing 'const T' as 'const std::initializer_list<int>' m.cpp:4:6: warning: in call to 'void f(const T&) [with T = std::initializer_list<int>]' m.cpp:6:25: warning: (you can disable this with -fno-deduce-init-list) 任何人都可以解释我怎样才能使这项工作没有任何警告? 谢谢!

std :: thread通过引用调用复制构造函数

那么我有一个使用std :: thread将数据传递到线程的问题。 我以为我明白了复制构造函数等的一般语义,但似乎我不太明白这个问题。 我有一个简单的类叫做Log,隐藏了它的拷贝构造函数: class Log { public: Log(const char filename[], const bool outputToConsole = false); virtual ~Log(void); //modify behavior void appendStream(std::ostream *); //commit a new message void commitStatus(const std::string str); private: //members std::ofstream fileStream; std::list<std::ostream *> listOfStreams; //disable copy constructor and assignment operator Log(const Log &); Log & operator=(const Log &); } 现在我有一个主要依靠http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/echo/blocking_tcp_echo_server.cpp […]

是否有一个编译器错误暴露了我的实现is_completetypes特质?

我编写了这个C ++ 11 trait模板来检查一个types是否完整: template <typename…> using void_t = void; template <typename T, typename = void> struct is_complete : std::false_type {}; template <typename T> struct is_complete<T, void_t<decltype(sizeof(T))>> : std::true_type {}; 并像这样testing它: struct Complete {}; int main() { std::cout << is_complete<Complete>::value << is_complete<class Incomplete>::value << '\n'; } 我期望testing程序打印10 ,这是我得到的输出,当我编译与叮当3.4。 但是,使用gcc 4.9编译时,它会打印11字符 – 错误地将class Incomplete完整的class Incomplete识别为完整的。 我不知道我的代码是否正确,但在我看来,即使它是错误的,它应该在两个编译器上performance相同。 […]

C ++连接两个`const char`string文字

使用constexpr可以连接两个string文字吗? 或者换句话说,可以消除代码中的macros: #define nl(str) str "\n" int main() { std::cout << nl("usage: foo") nl("print a message") ; return 0; } 更新 :使用"\n"没有什么错,但是我想知道是否可以使用constexpr来replace这些types的macros。