草庐IT

c++ - 直接初始化条件内的对象

可以在if语句的条件内定义和复制初始化变量:if(inti=17){...}这也适用于用户定义的类型,因为它们重载了operatorbool:if(Foof=42){...}if(Foof=Foo(43)){...}为什么我不能像下面这样使用直接初始化?if(Foof(51)){...}GCC发出error:expectedprimary-expressionbefore'f'。LiveonColiru除了“因为语法这么说”之外还有其他原因吗?我该如何解决?我正在使用VC++03,其中Foo:是一个RAII敏感对象,我注意没有定义一个复制构造函数是一个接受用户参数的模板有一个双参数构造

c++ - 是否曾在大型多线程 C++ 程序中使用过通信顺序进程?

我目前正在编写一个大型多线程C++程序(>50KLOC)。因此,我一直有动力阅读大量有关处理多线程代码的各种技术。我发现一个很酷的理论是:http://en.wikipedia.org/wiki/Communicating_sequential_processes它是由一个小有名气的人发明的,他对并发编程做出了其他不平凡的贡献。然而,CSP在实践中使用了吗?谁能指出任何以CSP风格编写的大型应用程序?谢谢! 最佳答案 CSP作为过程演算,从根本上说是一种理论事物,它使我们能够形式化和研究并行程序的某些方面。如果您想要的是能够构建分布

c++ - C++类的大小是如何确定的?

总结:编译器在编译过程中如何静态确定C++类的大小?详细信息:我试图了解用于确定一个类将使用多少内存以及如何对齐内存的规则。例如,下面的代码声明了4个类。前2个都是16个字节。但是3是48字节,尽管它包含与前2相同的数据成员。而第四类与第三类具有相同的数据成员,只是顺序不同,但它是32字节。#include#includeclassTestClass1{__m128ivect;};classTestClass2{charbuf[8];charbuf2[8];};classTestClass3{charbuf[8];__m128ivect;charbuf2[8];};classTestC

c++ - 为什么 Boost MPL 有整数常数?

既然您可以将整数值作为模板参数并对它们执行算术运算,那么boost::mpl::int_和其他整数常量背后的动机是什么?这种动机是否仍然适用于C++11? 最佳答案 您可以将整数值作为模板参数,但您不能在一个模板中同时使用类型和非类型模板参数。长话短说,将非类型模板参数视为类型允许它们与MPL中的无数事物一起使用。例如,考虑一个元函数find它与类型一起使用并在序列中寻找相同的类型。如果您希望将它与非类型模板参数一起使用,您需要重新实现新算法“重载”,find_c为此,您必须手动指定整数值的类型。现在假设您希望它像其他语言一样使用混

c++ - 不转发通用引用会出现什么样的问题?

据我所知,在C++11中,通用引用应该始终与std::forward一起使用,但我不确定如果会出现什么样的问题std::forward未使用。templatevoidf(T&&x);{//Whatifxisusedwithoutstd::forward(x)?}您能否举例说明这种情况下可能出现的问题? 最佳答案 没有这样的规则总是将std::forward与通用引用一起使用。相反,在具有通用引用的函数中到处使用std::forward可能很危险。看看下面的例子:templateautomake_pair(T&&t){returnst

c++ - 透视投影中的 3D 场景平移 (OpenGL)

我设计了一个C++类,将用户从轨迹球旋转、缩放和平移中抽象出来。我已经按预期进行了旋转(使用轨迹球)和缩放。但是,平移并不像预期的那样运行。当我选择一个点并拖动时,我希望在完成拖动时,选择的点继续位于鼠标下方。我对透视投影中的平移的理解如下。目标和相机位置都会受到平移操作的影响。相机目标和相机位置(眼睛)应与阻力成比例地平移。比例(可能不是常数)应基于z深度。平移在正交投影中是直截了当的,但会带来透视问题。如果能够解释OpenGL的数学和实现细节,将会很有用。 最佳答案 我不知道OpenGL的细节,但如果我正确理解你的问题,我可以帮

c++ - 使用临时函数对象进行全局初始化

下面的代码#includestd::mt19937generator((std::random_device())());只用clang编译文件:$clang++-c-std=c++0xtest.cpp但是gcc失败了:$g++-c-std=c++0xtest.cpptest.cpp:3:47:erro:expectedprimary-expressionbefore‘)’token该代码在C++11中有效吗?它是GCC中的错误还是Clang的扩展/错误? 最佳答案 gcc将子表达式(std::random_device())()解

c++ - 为什么我在 OpenGL 的透视投影中将 Z 除以 W?

我想这与其说是一个OpenGL问题,不如说是一个数学问题,但我离题了。无论如何,如果透视除法的全部目的是获得可用的x和y坐标,为什么还要用w除以z?另外,我如何首先获得w? 最佳答案 实际上,解释更多的是与深度缓冲区的限制有关,而不是数学。简单来说,“深度缓冲区是一种纹理,其中每个屏幕上的像素都根据其与相机的距离分配一个灰度值。这使得视觉效果可以随距离轻松改变。”Source更准确地说,深度缓冲区是包含每个fragment的z/w值的纹理。,其中:Z是近裁剪平面到片段的距离。W是相机到片段的距离。在下图中说明了z、w和z/w之间的关

c++ - 函数的未命名参数可以有默认值吗?

以下代码在C++中是否合法?voidf(void*=0){}intmain(){f();}C++标准的哪一页声明这种用法是合法的? 最佳答案 是的,这是合法的。没有标准的措辞来专门允许这种功能组合;也没有什么可以禁止的。默认参数语法适用于参数声明中的函数参数:[C++11:8.3.6/1]:Ifaninitializer-clauseisspecifiedinaparameter-declarationthisinitializer-clauseisusedasadefaultargument.Defaultargumentswil

c++ - 为什么 C++ 左值对象不能绑定(bind)到右值引用 (&&)?

move语义的想法是您可以从另一个临时对象(由右值引用引用)中获取所有内容并将该“所有内容”存储在您的对象中。这有助于避免在事物的单一构造就足够的情况下进行深度复制——因此您在右值对象中构造事物,然后将其move到长期存在的对象中。为什么C++不允许将左值对象绑定(bind)到右值引用?两者都允许我更改引用的对象,因此在访问引用对象的内部方面对我来说没有区别。我能猜到的唯一原因是函数重载歧义问题。 最佳答案 ButwhyC++doesn'tallowbindinglvalueobjectstorvaluereferences?假设您