Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将第一个和第二个赋值给语义命名变量的配对_C++_Reference_Std Pair - Fatal编程技术网

C++ 将第一个和第二个赋值给语义命名变量的配对

C++ 将第一个和第二个赋值给语义命名变量的配对,c++,reference,std-pair,C++,Reference,Std Pair,关于“std::pair vs struct with two fields”有一个非常流行的问题。但是我有一个问题,关于将first和second值重新分配给语义命名的变量。在常规场景中,我们有如下内容: const std::pair<const int, const int> result = processSomething(); std::cout << result.second << " of " << result.first &l

关于“std::pair vs struct with two fields”有一个非常流行的问题。但是我有一个问题,关于将
first
second
值重新分配给语义命名的变量。在常规场景中,我们有如下内容:

const std::pair<const int, const int> result = processSomething();
std::cout << result.second << " of " << result.first << std::endl;
const std::pair result=processSomething();

std::cout我没有看到任何严重的缺点,具有有意义名称的变量可以帮助代码更加清晰。一个好的优化编译器应该能够在简单的情况下(例如您的示例)消除额外引用的任何开销,但在类型不相同的更复杂的情况下(例如,它们具有不同的常量限定或需要转换),可能无法消除额外引用的任何开销

在某些情况下,还有另一个选项可能更清晰:您可以创建所需的变量,然后创建对这些变量的引用,并通过引用分配给它们,而不是使用结果初始化

int numTotal;
int NumSuccessful;
std::pair<int&, int&> result(numTotal, numSuccessful);
result = processSomething();
int numTotal;
int NumSuccessful;
std::pair<int&, int&>(numTotal, numSuccessful) = processSomething();
一个更不寻常的解决方案不涉及临时对象,允许您通过使用具有有意义的成员名称的本地类型来创建变量
const

struct Num {
  Num(std::pair<const int, const int> p) : total(p.first), successful(p.second) { }
  int total;
  int sucessful;
};
const Num num = processSomething();
std::cout << num.successful << '/' << num.total << '\n';
struct Num{
Num(std::pairp):总计(p.first),成功(p.second){
整数合计;
成功;
};
const Num=processSomething();

std::您是否考虑过使用引用?您可以使用引用:
const int&numTotal=pair.first int /代码> s)。不幸的是,该语言还不允许tie构造(这意味着在使用
tie
-trick之前必须首先定义变量)。请注意
std::tie
不生成一对,而是生成一个引用元组。差别可能相当重要。@Xarn,是的,这就是重点。您可以将
分配给
元组
,这样它就完成了所需的操作。我的理解是,额外的变量(别名)是否真的存在,或者是否被优化器省略了。第二段代码很好,但从编译器的角度来看,他仍然在
processSomething()中调用构造函数
然后在外部调用复制构造函数,所以我认为对于C++98来说,
struct
还是更好的方法:(
int numTotal;
int NumSuccessful;
std::tie(numTotal, numSuccessful) = processSomething();
struct Num {
  Num(std::pair<const int, const int> p) : total(p.first), successful(p.second) { }
  int total;
  int sucessful;
};
const Num num = processSomething();
std::cout << num.successful << '/' << num.total << '\n';