Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

3
在基于范围的for循环中使用转发引用有什么好处?
const auto&如果我要执行只读操作就足够了。但是,我碰到了 for (auto&& e : v) // v is non-const 最近几次。这让我感到奇怪: 与auto&或相比,在某些晦涩难懂的情况下使用转发引用是否有一些性能优势const auto&? (shared_ptr疑似死角案件) 更新 在我的收藏夹中找到的两个示例: 遍历基本类型时使用const引用有什么缺点吗? 我可以使用基于范围的for循环轻松地迭代地图的值吗? 请集中讨论以下问题:为什么我要在基于范围的for循环中使用auto &&?



4
`const shared_ptr <T>`和`shared_ptr <const T>`之间的区别?
我正在为C ++中的共享指针编写访问器方法,该方法如下所示: class Foo { public: return_type getBar() const { return m_bar; } private: boost::shared_ptr&lt;Bar&gt; m_bar; } 因此,要支持getBar()return类型的常量性,应boost::shared_ptr防止Bar它指向的修改。我的猜测是shared_ptr&lt;const Bar&gt;要返回该类型的类型,而const shared_ptr&lt;Bar&gt;这将防止指针本身重新分配以指向不同的对象,Bar但允许Bar对其指向的对象进行修改。但是,我不确定。如果知道的人可以确认这一点,或者如果我弄错了,请更正我,我将不胜感激。谢谢!
115 c++  boost  const  shared-ptr 


5
CMake输出/构建目录
我是CMake的新手,阅读了一些有关如何使用它的教程,并编写了一些复杂的50行CMake脚本,以便为3个不同的编译器编写程序。这可能总结了我在CMake中的全部知识。 现在我的问题是我有一些源代码,制作程序时我不想碰到/碰到它们的文件夹。我希望所有CMake以及make输出文件和文件夹都进入其中../Compile/,因此我为此在CMake脚本中更改了一些变量,并且在我在笔记本电脑上执行以下操作时它起作用了: Compile$ cmake ../src Compile$ make 在那里,我现在在的文件夹中有干净的输出,这正是我想要的。 现在,我移至另一台计算机,并重新编译了CMake 2.8.11.2,然后我几乎回到了原来的水平!它总是将东西编译到srcmy所在的文件夹中CMakeLists.txt。 我在CMake脚本中选择目录的部分是: set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Compile/) set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE) set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir}) set(CMAKE_BUILD_FILES_DIRECTORY ${dir}) set(CMAKE_BUILD_DIRECTORY ${dir}) set(CMAKE_BINARY_DIR ${dir}) SET(EXECUTABLE_OUTPUT_PATH ${dir}) SET(LIBRARY_OUTPUT_PATH ${dir}lib) SET(CMAKE_CACHEFILE_DIR ${dir}) 现在,它总是以: -- Build files have been written to: /.../src …
115 c++  build  makefile  cmake  output 

30
C ++的隐藏功能?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它当前不接受新的答案或互动。 当涉及到“隐藏特征”问题时,没有C ++喜欢吗?想通了,我会把它扔在那里。C ++的一些隐藏功能是什么?

4
检测到“ RuntimeLibrary”不匹配
我在C:\ cryptopp中下载并提取了Crypto ++。我使用Visual Studio Express 2012构建了内部的所有项目(如自述文件中所述),并且一切均已成功构建。然后,我在其他文件夹中创建了一个测试项目,并添加了cryptolib作为依赖项。之后,我添加了include路径,以便可以轻松包含所有标头。尝试编译时,出现有关未解析符号的错误。 为了解决这个问题,我添加C:\cryptopp\Win32\Output\Debug\cryptlib.lib了链接其他依赖项的链接。现在我得到这个错误: Error 1 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(cryptlib.obj) CryptoTest Error 2 error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in program.obj C:\Data\Work\C++ VS\CryptoTest\CryptoTest\cryptlib.lib(iterhash.obj) CryptoTest Error 3 error LNK2038: mismatch …

6
在C ++中将int设置为Infinity
我有一个int a需要等于“无穷大”的东西。这意味着 int b = anyValue; a&gt;b 永远是真的。 C ++是否有任何功能可以使之成为可能?
114 c++  infinity 

13
在C ++中,应该麻烦缓存变量还是让编译器进行优化?(别名)
考虑以下代码(p类型为,unsigned char*并且bitmap-&gt;width为某种整数类型,确切地是未知的,并且取决于我们使用的某些外部库的版本): for (unsigned x = 0; x &lt; static_cast&lt;unsigned&gt;(bitmap-&gt;width); ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } 是否值得对其进行优化[..] 在某些情况下,可以通过编写以下内容产生更有效的结果: unsigned width(static_cast&lt;unsigned&gt;(bitmap-&gt;width)); for (unsigned x = 0; x &lt; width; ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } ...还是对编译器进行优化很简单? 您认为什么是“更好”的代码? 编辑者(Ike)的注释:对于那些对删除线文本感到疑惑的人,最初的问题措词很危险,接近主题外的领域,尽管获得了积极的反馈,却非常接近完成。这些已经被淘汰了。但是,请不要惩罚回答了问题的这些问题的回答者。

2
C ++标准委员会打算在C ++ 11中unordered_map销毁它插入的内容吗?
我刚刚度过了三天的时间,一直在寻找一个非常奇怪的错误,在这个错误中unordered_map :: insert()破坏了您插入的变量。这种高度非显而易见的行为仅发生在最近的编译器中:我发现clang 3.2-3.4和GCC 4.8是唯一展示此“功能”的编译器。 这是我的主要代码库中的一些简化代码,可以说明该问题: #include &lt;memory&gt; #include &lt;unordered_map&gt; #include &lt;iostream&gt; int main(void) { std::unordered_map&lt;int, std::shared_ptr&lt;int&gt;&gt; map; auto a(std::make_pair(5, std::make_shared&lt;int&gt;(5))); std::cout &lt;&lt; "a.second is " &lt;&lt; a.second.get() &lt;&lt; std::endl; map.insert(a); // Note we are NOT doing insert(std::move(a)) std::cout &lt;&lt; "a.second is now " &lt;&lt; a.second.get() &lt;&lt; std::endl; return 0; …
114 c++  gcc  c++11  clang  standards 

11
智能指针:谁拥有对象?[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊不清,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 8年前关闭。 C ++全部关于内存所有权(也称为所有权语义)。 动态分配的内存块的所有者负责释放该内存。因此,问题实际上变成了谁拥有记忆。 在C ++所有权中,原始指针被包装在其中,因此在一个良好的(IMO)C ++程序中,很少会看到原始指针传递(很少,不是永远不会)(因为原始指针没有推断出的所有权,因此我们可以不知道谁是内存的所有者,因此,如果不仔细阅读文档,就无法知道谁对内存负责。 相反,很少看到原始指针存储在类中,每个原始指针都存储在其自己的智能指针包装器中。(注意:如果您不拥有对象,则不应存储该对象,因为您不知道该对象何时会超出范围并被破坏。) 所以问题是: 人们遇到过哪种所有权语义? 哪些标准类用于实现这些语义? 您觉得它们在什么情况下有用? 让我们为每个答案保留一种类型的语义所有权,以便可以分别对它们进行表决。 摘要: 从概念上讲,智能指针很简单,简单的实现也很容易。我已经看到了许多尝试的实现,但是它们总是以某种偶然使用和示例不明显的方式被破坏。因此,我建议始终使用库中经过良好测试的智能指针,而不要自己动手。std::auto_ptr或Boost智能指针之一似乎可以满足我的所有需求。 std::auto_ptr&lt;T&gt;: 一个人拥有该对象。允许转让所有权。 用法:这允许您定义显示显式所有权转移的接口。 boost::scoped_ptr&lt;T&gt; 一个人拥有该对象。不允许转让所有权。 用法:用于显示明确的所有权。对象将由析构函数或明确重置后销毁。 boost::shared_ptr&lt;T&gt;(std::tr1::shared_ptr&lt;T&gt;) 多重所有权。这是一个简单的引用计数指针。当引用计数达到零时,对象将被销毁。 用法:一个对象可以具有多个编译器,且其生存期在编译时无法确定。 boost::weak_ptr&lt;T&gt;: 用于shared_ptr&lt;T&gt;可能发生指针循环的情况。 用法:仅当循环维护共享引用计数时,用于停止保留对象的循环。

9
C ++中的“ int&foo()”是什么意思?
在阅读有关左值和右值的解释时,这些代码行向我伸出来: int&amp; foo(); foo() = 42; // OK, foo() is an lvalue 我在g ++中尝试过,但是编译器说“对foo()的未定义引用”。如果我加 int foo() { return 2; } int main() { int&amp; foo(); foo() = 42; } 它可以很好地编译,但是运行它会产生分段错误。只是线 int&amp; foo(); 本身既可以编译又可以毫无问题地运行。 此代码是什么意思?如何为函数调用分配值,为什么它不是右值?



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.