该cplusplus.com shared_ptr页面召唤出一个区分空 std::shared_ptr和空 shared_ptr.该cppreference.com页面没有明确叫出区别,但同时使用"空",并比较nullptr其描述std::shared_ptr行为.
空和空之间有区别shared_ptr吗?这种混合行为指针有用例吗?非空null是否shared_ptr有意义?是否会出现正常使用情况(即如果你没有明确构造一个),你最终会得到一个空但非空的shared_ptr?
如果您使用的是Boost版本而不是C++ 11版本,那么这些答案中的任何一个都会改变吗?
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<int> v = {1, 2, 3, 4, 5, 6, 7};
int i = -4;
cout << i << endl;
cout << v.size() << endl;
cout << i % v.size() << endl;
cout << -4 % 7 << endl;
}
Run Code Online (Sandbox Code Playgroud)
The above code prints:
-4
7
5
-4
Run Code Online (Sandbox Code Playgroud)
Can someone please explain why i % v.size() prints 5 instead of -4? I'm guessing it has something to do …
我发现自己做的一件常见的事情是制作"几乎默认"的复制构造函数和赋值运算符.也就是说,我发现自己处于编译器提供的复制和赋值运算符适用于大多数数据成员的情况,但是有一个特定的数据成员需要以不同的方式处理.这意味着我必须显式创建一个复制构造函数/赋值运算符,包括显式列出具有简单复制语义的所有数据成员.对于存在大量数据成员的类,或者稍后添加成员变量但未添加到复制构造函数/赋值运算符的类时,这会很烦人.
有没有办法告诉C++编译器显式声明的复制构造函数/赋值运算符应该像隐式运算符一样工作,除了之后运行的一些额外代码?(并且这样的语法与C++ 98兼容,还是需要C++ 11或C++ 14支持?)
在GCC上,我们可以-ffast-math加速浮点计算.但是当我们依赖于NaN和Inf浮点值的正确行为时,我们也会打开-fno-finite-math-only,因此假设值不是NaN/Inf的优化
对于MSVC来说,-ffast-math显然是"等同" /fp:fast.但是,与GCC一样-ffast-math,它还包括假设Nan/Inf不存在的优化.(重要的是,似乎测试像std :: isnan()不能保证给出"准确"的结果.)
是否有一个MSVC C++编译选项,它允许您利用大多数/fp:fast优化,但仍然"正确"处理NaN和Inf值?(或者至少,保证像std :: isnan()/ std :: isinf()这样的测试会检测NaN/Inf,如果它们恰好被生成了.)
我熟悉添加-v到 Clang 编译命令行以查看包含搜索路径顺序的技巧,但这只是显示正在搜索哪些目录。它没有显示为什么要搜索这些目录。
是否有一些选项可以打印有关包含搜索路径设置来自何处的详细信息?(例如,命令行选项、环境、编译设置等)——任何能够提供有关它们为何按顺序排列的更多信息的设置也将受到赞赏。
请注意,我并不想知道特定的包含文件来自哪里(例如,您可以使用-M或获得的信息-H),我感兴趣的是编译器为什么要搜索特定的包含路径。
背景:我们正在尝试调试为什么特定路径 (/usr/local/include) 在特定平台 (Mac 10.14) 的搜索目录列表中出现“太高”。我们认为我们的构建系统没有明确请求它,因此更多地了解它的来源将有助于我们弄清楚发生了什么。
有没有办法编写 shebang 行,以便它可以找到 Python3 解释器(如果存在)?
天真地,从PEP 394 开始,我希望这#!/usr/bin/env python3应该可行。
但是,我注意到在某些使用pythonPython3 的系统上,它们不提供python3别名。在这些系统上,您需要使用#!/usr/bin/env python来获取 Python3。
有没有一种强大的方法来处理这种歧义?有没有办法编写shebang行,以便它python3在存在时使用,但python如果没有则尝试?(要求最终用户手动修复他们的系统以添加python3别名并不理想。)
我们正在使用奇怪的重复模板模式来实现单例.但是,在最近的Clang版本中,我们得到了一个-Wundefined-var-template警告.建议的修复是添加"显式实例化声明".
我试图这样做,但后来我在编译单元中获得了"实例化后显式特化"的错误,其中单例模板类成员变量的定义是.
解决此警告突出显示的问题的适当构造是什么?
简化细节(已删除大部分逻辑,以制作MCVE):
SingletonBase.hh:
template < class T > class SingletonBase {
public:
static T * get_instance() {
if ( ! instance_ ) {
instance_ = T::create_singleton_instance();
}
return instance_;
}
private:
static T * instance_;
};
Run Code Online (Sandbox Code Playgroud)
Singleton.hh:
#include "SingletonBase.hh"
class Singleton : public SingletonBase< Singleton > {
friend class SingletonBase< Singleton >;
public:
int do_stuff(int v) { return v+2; }
private:
static Singleton * create_singleton_instance() {
return new Singleton;
}
};
Run Code Online (Sandbox Code Playgroud)
Singleton.cc:
#include "Singleton.hh"
template …Run Code Online (Sandbox Code Playgroud) 我们在混合环境中开发 - 有些人在Mac上工作,有些人在Linux上工作.事实证明,这有时是一个挑战,因为那些在Linux上工作的人习惯于让他们的文件系统区分大小写,所以提交(意外或其他)多个文件的问题不一样.(例如FileName.ext对filename.ext)
但是,当Mac上的人员去检查存储库时,拥有不区分大小写的文件系统意味着这两个文件(仅在大小写上有所不同)会相互覆盖并造成一般性破坏.
我知道有各种git设置可以帮助人们对不区分大小写的文件系统更好地处理案例更改(例如core.ignorecase),但是这些并不能解决存储库中有两个不同文件的问题,只是大小写不同.
我意识到修复它的唯一方法是确保Linux人员不提交两个文件,只有在第一时间才有区别. - 如果区分大小写的文件系统上的用户尝试提交在不区分大小写的文件系统上会相互混淆的文件,那么git中是否会出现一个警告或错误?
假设您有一个C++函数,它使用(const)参数的更改版本.
MyObject alter_obj( MyObject const & obj ); // Creates new, altered object
void func( MyObject const & original ) {
MyObject const & altered( alter_obj( original ) );
// ...
}
Run Code Online (Sandbox Code Playgroud)
这是正常的,因为临时的寿命延长,因为"最重要的const".如果alter_obj()满足返回值优化的要求,它也是相当有效的,因为RVO意味着不会不必要地复制由值返回的更改对象.
如果你根本没有改变它也会很有效:
void func( MyObject const & original ) {
MyObject const & not_altered( original );
// ...
}
Run Code Online (Sandbox Code Playgroud)
对给定对象的附加引用基本上是免费的,没有制作副本的任何性能开销.
但是说需求会有所改变,并且您希望根据运行时条件选择是否进行更改.天真地,我原本以为使用三元运算符来组合前两种方法将是有效的,在可能的情况下直接绑定原始对象,或者如果不是则绑定临时对象.
MyObject alter_obj( MyObject const & obj ); // Creates new, altered object
void func( MyObject const & original ) {
// ...
MyObject const & …Run Code Online (Sandbox Code Playgroud) 我一直在玩gcc的-H选项,它打印出有关C和C ++编译中直接和间接包含的信息(gcc手册的相关部分)。
作为输出的一部分,有一个部分“多个包含保护可能对:有用”,其中列出了许多项目和系统头。
这是什么意思,如何确定此列表,以及为什么说“多个”包含防护可能有用?
(我熟悉包含防护的一般概念,以及为什么要使用它们-我正在寻找有关此消息的详细信息,以及这对我的项目意味着什么。)
c++ ×7
c++11 ×2
clang++ ×2
crtp ×1
gcc ×1
git ×1
header-files ×1
ieee-754 ×1
include-path ×1
linux ×1
lvalue ×1
macos ×1
modulus ×1
python ×1
python-3.x ×1
reference ×1
rvalue ×1
shared-ptr ×1
shebang ×1
singleton ×1
visual-c++ ×1