Questions tagged «c++»

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

5
使用自定义的std :: set比较器
Наэтотвопросестьответына 堆栈溢出нарусском:Компаратордля集 我试图将一组整数中的项目的默认顺序更改为字典式而不是数字式,并且无法使用g ++进行以下编译: file.cpp: bool lex_compare(const int64_t &a, const int64_t &b) { stringstream s1,s2; s1 << a; s2 << b; return s1.str() < s2.str(); } void foo() { set<int64_t, lex_compare> s; s.insert(1); ... } 我收到以下错误: error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class …
105 c++  stl 

2
constexpr暗示内联吗?
考虑以下内联函数: // Inline specifier version #include<iostream> #include<cstdlib> inline int f(const int x); inline int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); } 和constexpr等效版本: // Constexpr specifier version #include<iostream> #include<cstdlib> constexpr int f(const int x); constexpr int f(const int x) { return 2*x; …

5
传递值和std :: move优于传递参考
我目前正在学习C ++,并尝试避免养成不良习惯。据我了解,clang-tidy包含许多“最佳实践”,并且我会尽力做到最好(即使我不一定理解为什么它们仍然被认为是好的),但是我不确定我是否了解这里的建议。 我从教程中使用了此类: class Creature { private: std::string m_name; public: Creature(const std::string &name) : m_name{name} { } }; 这导致clang-tidy建议我应该按值传递,而不是引用和使用std::move。如果这样做,我得到建议做name一个参考(以确保每次都不会被复制),并且警告是std::move无效的,因为它name是一个警告,const所以我应该删除它。 我没有收到警告的唯一方法是const完全删除: Creature(std::string name) : m_name{std::move(name)} { } 这似乎合乎逻辑,因为的唯一好处const是防止与原始字符串混淆(因为我按值传递,所以不会发生)。但是我在CPlusPlus.com上阅读: 尽管要注意-在标准库中-移动意味着从中移出的对象处于有效但未指定的状态。这意味着在执行此操作后,仅应销毁移出对象的值或为其分配新值;否则访问它会产生未指定的值。 现在想象一下这段代码: std::string nameString("Alex"); Creature c(nameString); 因为nameString通过值传递,所以std::move只会name在构造函数内部无效,而不会接触原始字符串。但是,这样做的好处是什么?似乎该内容仅被复制一次-如果我在调用时通过引用传递m_name{name},如果在传递时通过值传递(然后它被移动)。我知道这比按值传递而不使用std::move(因为它被复制两次)更好。 有两个问题: 我是否正确理解这里发生的事情? 使用std::move按引用传递和仅调用有任何好处m_name{name}吗?
105 c++ 


7
为什么argc不是常数?
int main( const int argc , const char[] const argv) 正如有效的C ++项目#3指出“尽可能使用const”一样,我开始思考“为什么不设置这些“常量”参数const”? 在程序中是否存在argc修改的值的情况?
104 c++  const  main  argc  effective-c++ 


4
布尔运算符++和-
今天,在编写一些Visual C ++代码时,我遇到了使我感到惊讶的东西。似乎C ++支持布尔值++(递增),但不支持-(递减)。这仅仅是一个随机决定,还是背后有某些原因? 这样编译: static HMODULE hMod = NULL; static bool once = false; if (!once++) hMod = LoadLibrary("xxx"); 这不是: static HMODULE hMod = NULL; static bool once = true; if (once--) hMod = LoadLibrary("xxx");
104 c++  boolean  increment 

13
为什么不可能构建可以确定C ++函数是否会更改特定变量的值的编译器?
我在一本书中读到了这一行: 事实证明,构建真正可以确定C ++函数是否会更改特定变量值的编译器是不可能的。 该段讨论的是为什么在检查常量性时编译器为什么会保守。 为什么不可能构建这样的编译器? 编译器始终可以检查是否重新分配了变量,是否在其上调用了非常量函数或是否将其作为非常量参数传入...

8
如何检查C ++ 11支持?
有没有一种方法可以在编译时检测编译器是否支持C ++ 11的某些功能?例如,如下所示: #ifndef VARIADIC_TEMPLATES_SUPPORTED #error "Your compiler doesn't support variadic templates. :(" #else template <typename... DatatypeList> class Tuple { // ... } #endif
104 c++  c++11 

10
索引到结构是否合法?
不管代码有多“糟糕”,并假设对齐等在编译器/平台上都不是问题,这种未定义或破坏的行为是吗? 如果我有这样的结构:- struct data { int a, b, c; }; struct data thing; 它是合法的访问a,b并c作为(&thing.a)[0],(&thing.a)[1]和(&thing.a)[2]? 在每种情况下,我都会在每个编译器和平台上对其进行尝试,并在每个设置上对其进行“尝试”。我只是担心编译器可能不会意识到b和thing [1]是同一件事,并且存储到“ b”的内容可能会放在寄存器中,而thing [1]从内存中读取错误的值(例如)。在每种情况下,我都尝试过它做对了。(我当然知道并不能证明太多) 这不是我的代码;这是我必须使用的代码,我对这是不好的代码还是坏的代码很感兴趣,因为不同之处会影响我对其进行大量更改的优先级:) 标记为C和C ++。我主要是对C ++感兴趣,但对C也很感兴趣,只是出于兴趣。
104 c++  c  struct 

27
交换两个变量值而不使用第三个变量
采访中提出的非常棘手的问题之一。 交换两个变量的值,例如a=10和b=15。 通常要交换两个变量值,我们需要第三个变量,例如: temp=a; a=b; b=temp; 现在的要求是,不使用第三变量就交换两个变量的值。
104 c++ 

1
C ++编译错误:具有初始化程序,但类型不完整
我正在Eclipse中进行编码,并且具有以下内容: #include <ftream> #include <iostream> void read_file(){ char buffer[1025]; std::istringstream iss(buffer); } 但是,当我尝试构建时,出现以下错误: variable 'std::istringstream iss' has initializer but incomplete type 有什么想法吗?我到处搜索,似乎大多数有此问题的人根本没有包括正确的头文件,我相信我做的正确。

3
C ++ 20中的协程是什么?
什么是协程 C ++ 20? 它与“ Parallelism2”或/和“ Concurrency2”有何不同(请看下图)? 下图来自ISOCPP。 https://isocpp.org/files/img/wg21-timeline-2017-03.png
104 c++  coroutine  c++20 


2
std :: move()如何将值转换为RValues?
我只是发现自己不完全了解的逻辑std::move()。 起初,我在Google上进行了搜索,但似乎只有有关如何使用的文档std::move(),而不是其结构的工作原理。 我的意思是,我知道模板成员函数是什么,但是当我查看std::move()VS2010中的定义时,它仍然令人困惑。 std :: move()的定义如下。 template<class _Ty> inline typename tr1::_Remove_reference<_Ty>::_Type&& move(_Ty&& _Arg) { // forward _Arg as movable return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg); } 我最奇怪的是参数(_Ty && _Arg),因为当我像下面看到的那样调用该函数时, // main() Object obj1; Object obj2 = std::move(obj1); 它基本上等于 // std::move() _Ty&& _Arg = Obj1; 但是,正如您已经知道的那样,您不能直接将LValue链接到RValue引用,这使我认为它应该是这样的。 _Ty&& _Arg = (Object&&)obj1; 但是,这很荒谬,因为std :: move()必须适用于所有值。 因此,我想充分理解它是如何工作的,我也应该看看这些结构。 …

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.