我可以通过其他角色通知处理程序吗?我该怎么做让ansible找到它?
用例是,例如我想配置一些服务,然后在更改时重新启动它.不同的操作系统可能有不同的文件要编辑,甚至文件格式也可能不同.所以我想把它们放到不同的角色(因为文件格式可能不同,不能通过设置group_vars来完成).但重启服务的方式是相同的,使用service模块; 所以我想把处理程序放到common角色上.
无论如何要实现这一目标?谢谢.
在C++ 11中,我们可以声明一个自动生成的析构函数:
struct X {
virtual ~X() = default;
};
Run Code Online (Sandbox Code Playgroud)
此外,我们可以声明析构函数是纯虚拟的:
struct X {
virtual ~X() = 0;
};
Run Code Online (Sandbox Code Playgroud)
是我的问题:要如何声明析构函数都自动生成和纯虚?看起来以下语法不正确:
struct X {
virtual ~X() = 0 = default;
};
Run Code Online (Sandbox Code Playgroud)
这两个都不是:
struct X {
virtual ~X() = 0, default;
};
Run Code Online (Sandbox Code Playgroud)
也不是这个:
struct X {
virtual ~X() = 0 default;
};
Run Code Online (Sandbox Code Playgroud)
编辑:对问题的目的进行一些澄清.基本上我想要一个空类是不可实例化的基类,但派生类是可实例化的,那么该类必须具有纯虚拟析构函数.但另一方面,我不想在.cpp文件中提供定义.所以我需要某种相当于的机制default.我想知道是否有人有想法解决这个问题.
以下代码不在gcc-4.7.1下编译,而是在clang-3.2下编译.哪一个遵循C++ 11标准?
struct X {
virtual ~X() = default;
};
struct Y : X {
virtual ~Y() = default;
};
Run Code Online (Sandbox Code Playgroud)
gcc-4.7.1抱怨说:
looser throw specifier for 'virtual Y::~Y()'
error: overriding 'virtual X::~X() noexcept(true)'
Run Code Online (Sandbox Code Playgroud)
显然,gcc-4.7.1认为X的默认析构函数是nothrow,但是Y的默认析构函数并不是没有.为什么是这样?任何人都可以参考标准中的正确位置吗?谢谢.
我在stackoverflow上看到了类似的问题,但我没有看到参考标准的答案.
下面的代码在clang ++ 3.7.0下编译,但被g ++ 5.3.1拒绝.两者都有-std=c++14选择权.哪个编译器正确?有谁知道标准在哪里谈论这个?谢谢.
#include <stdexcept>
using namespace std;
constexpr int f(int n) {
if (n <= 0) throw runtime_error("");
return 1;
}
int main() {
char k[f(1)];
}
Run Code Online (Sandbox Code Playgroud)
产量
[hidden] g++ -std=c++14 c.cpp
c.cpp: In function ‘constexpr int f(int)’:
c.cpp:7:1: error: expression ‘<throw-expression>’ is not a constant-expression
}
^
[hidden] clang++ -std=c++14 c.cpp
[hidden]
[hidden] g++ -v
Using built-in specs.
COLLECT_GCC=/usr/bin/g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release …Run Code Online (Sandbox Code Playgroud) 以下代码无法编译:
struct X {
friend class Y;
Y* ptr;
};
Run Code Online (Sandbox Code Playgroud)
该cppreference描述的情况为
...如果尚未声明友元声明中使用的类的名称,则会在现场进行前向声明.
如果"spot"表示声明朋友关系的位置,则声明该成员应该没问题Y* ptr.为什么不编译?标准中的哪个地方禁止这个?
std :: atomic是c ++ 11引入的新功能,但我找不到很多关于如何正确使用它的教程.那以下的做法是否通用又高效?
我使用的一种做法是我们有一个缓冲区,我想在一些字节上使用CAS,所以我做的是:
uint8_t *buf = ....
auto ptr = reinterpret_cast<std::atomic<uint8_t>*>(&buf[index]);
uint8_t oldValue, newValue;
do {
oldValue = ptr->load();
// Do some computation and calculate the newValue;
newValue = f(oldValue);
} while (!ptr->compare_exchange_strong(oldValue, newValue));
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
编辑:如果这些问题依赖于处理器/体系结构,那么x86/x64处理器的结论是什么?
每次我使用gdb附加到进程时,它都会停止目标程序,我需要输入'cont'才能让它继续运行.有没有办法在不停止的情况下附加到流程?如果进程停止一段时间后,进程的行为会有所不同,这会使事情变得更容易.
下面的代码在g ++ 4.9.2和clang ++ 3.7.0下表现不同.哪一个是正确的?标准中的哪一部分与此相关?谢谢.
#include <iostream>
using namespace std;
struct Base {
Base() = default;
Base(const Base&) = default;
Base(Base&&) = delete;
};
struct Derived : Base {
};
int main() {
const Base& b = true ? Derived() : Base();
}
Run Code Online (Sandbox Code Playgroud)
g ++接受它并且clang ++给出错误incompatible operand types ('Derived' and 'Base').请参阅下文了解详情.
[hidden]$ g++ -v
Using built-in specs.
COLLECT_GCC=/usr/bin/g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.9.2/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id …Run Code Online (Sandbox Code Playgroud) 假设我有两个structs:
struct X {};
struct Y { X x; }
Run Code Online (Sandbox Code Playgroud)
我有功能:
void f(X&);
void f(X&&);
Run Code Online (Sandbox Code Playgroud)
我怎样写一个函数g()是需要Y&或Y&&只有完美的转发X&或X&&至f(),分别为:
template <typename T>
void g(T&& t) {
if (is_lvalue_reference<T>::value) {
f(t.x);
} else {
f(move(t.x));
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码说明了我的意图,但随着参数数量的增加,它的可扩展性不高.有没有办法让它完美转发并使其可扩展?