是否有返回给定类型的基类型的类型特征模板。我所说的基本类型是指去掉所有值修饰符、const、volatile等的类型。例如,使用假设的特性函数:
base<int>::type == int
base<int const>::type == int
base<int&>::type == int
我知道remove_const和remove_reference,目前正在组合使用它们。但是,我想知道是否已经存在这样一种特征,或者我所指的东西是否有一个合适的名字?
根据我从和读到的内容,您可能认为volatile和并发编程是完全正交的概念,至少就C/C++而言是这样。
然而,在GCC的中,std::atomic的所有成员函数都有volatile限定符,在安东尼·威廉姆斯的 of std::atomic中也是如此。
那么,我的atomic<>变量是否需要为volatile呢?
我正在使用Xcode 4.6.2 (4H1003)中包含的Clang。
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
目前,我的编译器不会对此代码产生编译错误。
using AA = int const;
static AA const aa = 0;
因为我不熟悉准确的C++11规范,我不知道什么是正确的行为。
双const关键字出错。
const on using是不允许的。
这是个特例。
这是编译器的错误。
什么是标准的预期行为?
假设我有一个静态全局变量a,它在init()期间转换为函数调用中的int。在init()之后,在函数my_function_2中使用时是否仍然是易失性的?
static volatile int a;
init(void)
{
my_function_1((int)a);
}
my_function_2(void)
{
/* After init(), is a still volatile? */
}
是否需要在my_function_2()中重新限定为易失性?我在用c99。
我有一个用FILE* fp = fopen(...)在一个线程中打开一个文件的Visual C++程序。我希望该线程在一个事件对象上阻塞,而另一个线程读取该文件,然后在完成时向被阻塞的线程发出信号,然后该线程将关闭该文件。因为fp是在线程之间共享的,所以我将其声明为volatile FILE* fp。但是,fread()不会接受volatile作为其FILE*参数。我尝试使用本地指针,在将调用fread()的线程中使用FILE* fpLocal = fp;,但得到了以下结果:
Error: a value of type "volatile FILE*" cannot be
#include <iostream>
using std::cout;
using std::endl;
using std::boolalpha;
using std::add_rvalue_reference_t;
using std::is_reference_v;
int main(void) {
cout << boolalpha << is_reference_v<add_rvalue_reference_t<int>> << endl; // true
cout <<
我想将一个对象赋给相同类型的易失性对象,但由于编译器错误而失败。如何更改程序才能使其生效?除了让它工作,为什么我不能直接做呢?
我在这里使用Visual Studio 2010作为编译器。
class A
{
public:
};
int _tmain()
{
A a;
volatile A va;
va = a; // compiler error:C2678 here
return 0;
}
考虑以下两行代码:
std::atomic_flag a { }; // Since C++20
std::atomic_flag a = ATOMIC_FLAG_INIT; // Until C++20
在C++20中,第一行将a初始化为clear状态,但如果在C++17中使用它,则a将初始化为未指定的状态。第二行在C++20中不被推荐,但在C++ 17中,它将a初始化为清除状态。我怎么能把它们都写在密码里呢?我想我应该使用宏,但是那个宏到底是什么?它是否适用于所有其他std::atomic<T>类型的初始化?
如果我正在编写一个将参数转发给构造函数的泛型函数,有什么方法可以判断它是否是一个复制构造函数?基本上我想做的是:
template <typename T, typename... Args>
void CreateTAndDoSomething(Args&&... args) {
// Special case: if this is copy construction, do something different.
if constexpr (...) { ... }
// Otherwise do something else.
...
}
有一个函数"remove_cv“()可以删除常量和易失性。
我的问题是,为什么可以从"const volatile“删除到"int”,从"int * const volatile“删除到"int*”,但"const volatile *“与删除之前是相同的。
The possible code is from the site
template< class T >
struct remove_cv {
typedef typename std::remove_volatile<typename std::remove_