小编tow*_*owi的帖子

公共交换成员函数

复制和交换习语的漂亮答案中,有一段代码我需要一些帮助:

class dumb_array
{
public:
    // ...
    friend void swap(dumb_array& first, dumb_array& second) // nothrow
    {
        using std::swap; 
        swap(first.mSize, second.mSize); 
        swap(first.mArray, second.mArray);
    }
    // ...
};
Run Code Online (Sandbox Code Playgroud)

他补充说明

还有其他声称我们应该专门为我们的类型使用std :: swap,提供一个类内交换以及一个自由函数交换等等.但这都是不必要的:任何正确使用swap都将通过一个不合格的调用,我们的功能将通过ADL找到.一个功能就可以了.

随着friend我对"不友好"的条款一点,我必须承认.所以,我的主要问题是:

  • 看起来像一个自由函数,但它在类体内?
  • 为什么这不是swap静态的?它显然不使用任何成员变量.
  • "任何正确使用交换都会发现通过ADL进行交换"?ADL会搜索命名空间,对吧?但是它也看到了课程内部吗?或者在这里friend进来?

副题:

  • 随着C++ 11,我要记住我的swaps的noexcept
  • 随着C++ 11和它的范围,对,我应该将friend iter begin()friend iter end()在类中以同样的方式?我觉得friend这里不需要,对吗?

c++ friend copy-and-swap c++11

154
推荐指数
2
解决办法
2万
查看次数

Java`final`方法:它有什么承诺?

在Java类中,可以定义一个方法final,以标记此方法可能不会被覆盖:

public class Thingy {
    public Thingy() { ... }
    public int operationA() {...}
    /** this method does @return That and is final. */
    public final int getThat() { ...}
}
Run Code Online (Sandbox Code Playgroud)

这很清楚,它可能有助于防止意外覆盖,或者表现 - 但这不是我的问题.

我的问题是:从OOP的角度来看,我理解通过定义一个方法final,类设计者承诺这个方法将始终如所描述或隐含的那样工作.但是,这通常可能超出了班级作者的影响,如果该方法所做的事情比传递财产更复杂.

句法约束对我来说很清楚,但OOP意义上的含义是什么?final大多数班级作者在这个意义上是否正确使用?

final方法承诺什么样的"合同" ?

java oop final

134
推荐指数
3
解决办法
9万
查看次数

有没有返回RValue Reference(&&)有用的情况?

函数应该返回RValue Reference是否有原因?技巧,技巧,或成语或模式?

MyClass&& func( ... );
Run Code Online (Sandbox Code Playgroud)

我知道一般返回引用的危险,但有时我们会这样做,不管我们(T& T::operator=(T)只是一个惯用的例子).但是怎么样T&& func(...)?我们会从中获得这样的一般场所吗?与仅仅客户端代码相比,当编写库或API代码时,可能会有所不同?

c++ rvalue-reference move-semantics c++11

73
推荐指数
3
解决办法
1万
查看次数

为什么C++ 17结构化绑定不使用{}?

我在这里找到了*C++结构化绑定的原始提议.它提出了一种轻松绑定多个返回值的方法,即:

auto {a, b} = minmax(data);
Run Code Online (Sandbox Code Playgroud)

但现在我看到每个人都指向C++ 17/C++ 1z提议语法

auto [a, b] = minmax(data);
Run Code Online (Sandbox Code Playgroud)

既然我已经学会了"列表被编写{like,this}",那么会出现一个新的列表语法?为什么?花括号有什么问题?

c++ c++17 structured-bindings

51
推荐指数
4
解决办法
5360
查看次数

什么时候Gnu C++会在没有明确要求的情况下支持C++ 11?

目前,使用g ++ - 4.8.1,您必须通过C++ 11模式编译文件

g++ -std=c++11 -o prog.x prog.cpp
Run Code Online (Sandbox Code Playgroud)

我可以说,是否有计划?

g++ -o prog.x prog.cpp
Run Code Online (Sandbox Code Playgroud)

编译prog.cpp

也许prog.cpp

  • #include <regex>
  • thread_local
  • class Widget { int member = 5; }
  • MyType operator"" myt(const char*, sze_t);
  • 等等.

c++ gcc c++11 gcc4.8

46
推荐指数
3
解决办法
2万
查看次数

实时环境中的异常是否仍然不受欢迎?

几年前我被教过,在嵌入式系统或(非Linux-)内核开发C++实时应用程序中, 例外是不可取的.(也许那个教训来自gcc-2.95之前).但我也知道,异常处理变得更好.

那么,C++是否 -在实践中实时应用程序的上下文中的异常

  • 完全没用?
  • 甚至通过编译器开关关闭?
  • 还是非常小心的?
  • 或者现在处理得那么好,人们可以几乎自由地使用它们,并记住几件事情?
  • C++ 11会改变这个吗?

更新:异常处理是否真的需要 启用RTTI(正如一位回答者建议的那样)?是否涉及动态演员表或类似情节

c++ embedded exception real-time c++11

41
推荐指数
4
解决办法
5996
查看次数

std :: max()和std :: min()不是constexpr

我刚刚注意到新标准的定义min(a,b)max(a,b) 定义constexpr.

例25.4.7,[alg.min.max]:

template<class T> const T& min(const T& a, const T& b);
template<class T> T min(initializer_list<T> t);
Run Code Online (Sandbox Code Playgroud)

这不是很可惜吗?我本来想写的

char data[ max(sizeof(A),sizeof(B)) ];
Run Code Online (Sandbox Code Playgroud)

代替

char data[ sizeof(A) > sizeof(B) ? sizeof(A) : sizeof(B) ];
char data[ MAX(sizeof(A),sizeof(B)) ]; // using a macro
Run Code Online (Sandbox Code Playgroud)

那些不可能的constexpr原因什么?

c++ max min constexpr c++11

34
推荐指数
2
解决办法
1万
查看次数

C++ 11用例用于对和元组的piecewise_construct?

N3059中,我找到了对(和元组)的分段构造的描述(它在新标准中).

但是我不知道什么时候应该使用它.我发现了关于emplace和不可复制实体的讨论,但是当我尝试它时,我无法创建一个我需要 piecewiese_construct或可以看到性能优势的案例.

例.我以为我需要一个不可复制的类,但是movebale(转发需要):

struct NoCopy {
  NoCopy(int, int) {};
  NoCopy(const NoCopy&) = delete; // no copy
  NoCopy& operator=(const NoCopy&) = delete; // no assign
  NoCopy(NoCopy&&) {}; // please move
  NoCopy& operator=(NoCopy&&) {}; // please move-assign
};
Run Code Online (Sandbox Code Playgroud)

然后,我想到标准对构造会失败:

pair<NoCopy,NoCopy> x{ NoCopy{1,2}, NoCopy{2,3} }; // fine!
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.实际上,这是我所期望的,因为"移动东西"而不是在stdlib中的任何地方复制它应该是.

因此,我认为我没有理由这样做,或者说:

pair<NoCopy,NoCopy> y(
    piecewise_construct,
    forward_as_tuple(1,2),
    forward_as_tuple(2,3)
); // also fine
Run Code Online (Sandbox Code Playgroud)
  • 那么,什么是用
  • 我如何以及何时使用piecewise_construct

tuples forwarding use-case piecewise c++11

33
推荐指数
1
解决办法
9763
查看次数

Gnu C++宏__cplusplus标准符合?

Gnu C++编译器似乎定义__cplusplus1

#include <iostream> 
int main() {
  std::cout << __cplusplus << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

1在标准c ++模式下以gcc 打印,在C++ 0x模式下打印,使用gcc 4.3.4和gcc 4.7.0.

C++ 11 FDIS在"16.8预定义宏名[cpp.predefined]"中

编译C++转换单元时,名称__cplusplus定义为值201103L.(脚注:本标准的未来版本将以更大的值替换此宏的值.不合格的编译器应使用最多五位小数的值.)

旧的std C++ 03也有类似的规则.

GCC是否将此设置为1,因为它"不符合"

通过阅读该列表,我认为__cplusplus如果我有一个支持C++ 11的编译器,我可以使用以便携方式检查.但是使用g ++这似乎不起作用.我知道...EXPERIMENTAL...宏,但很好奇为什么g ++__cplusplus这种方式定义.

我最初的问题是在不同的空指针变体之间切换.像这样的东西:

#if __cplusplus > 201100L
#  define MYNULL nullptr
#else
#  define MYNULL NULL
#endif
Run Code Online (Sandbox Code Playgroud)

是否有一种简单且合理的便携式方式来实现这样的开关?

c++ gcc standards-compliance c++-standard-library c++11

32
推荐指数
1
解决办法
2万
查看次数

如何反转可变参数模板函数的参数顺序?

我有一个带有varargs模板参数模板函数,就像这样

template<typename Args...>
void ascendingPrint(Args... args) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

我想写

template<typename Args...>
void descendingPrint(Args... args) {
  /* implementation using ascendingPrint()? */
}
Run Code Online (Sandbox Code Playgroud)

如何在传递参数包之前反转参数包 的顺序args,即在伪代码中:

template<typename Args...>
void descendingPrint(Args... args) {
  ascendingPrint( reverse(args) );
}
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic-functions variadic-templates c++11

32
推荐指数
5
解决办法
7028
查看次数