我不明白为什么这段代码编译没有错误:
#include <iostream>
template <class T>
struct Test
{
static constexpr T f() {return T();}
};
int main()
{
Test<void> test;
test.f(); // Why not an error?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据标准是否可以,还是编译器容差?
我正在尝试确定是否可以以不能忽略返回值的方式声明C++函数(理想情况下,在编译时检测到).我尝试使用private(或在C++ 11,deleted中)声明一个类,operator void()以便在未使用返回值时尝试捕获隐式转换为void.
这是一个示例程序:
class Unignorable {
operator void();
};
Unignorable foo()
{
return Unignorable();
}
int main()
{
foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我的编译器(clang-703.0.31)说:
test.cpp:2:5: warning: conversion function converting 'Unignorable' to 'void' will never be used
operator void();
^
Run Code Online (Sandbox Code Playgroud)
并且不会在通话时发出任何错误或警告foo().所以,那是行不通的.有没有其他方法可以做到这一点?特定于C++ 11或C++ 14或更高版本的答案可以.
这种方法能true以某种方式返回吗?
public static <T> boolean isVoid(T t)
{
return t instanceof Void;
}
Run Code Online (Sandbox Code Playgroud) void*从内存的角度来看,将整数值转换为或者反之亦然?我的理解是void*一个未指定长度的内存块的地址.
这似乎就像比较苹果和橙子.
int myval = 5;
void* ptr = (void*)myval;
printf("%d",(int)ptr);
Run Code Online (Sandbox Code Playgroud)
我意识到我应该给出使用它的确切上下文.
int main(int argc, char* argv[]) {
long thread; /* Use long in case of a 64-bit system */
pthread_t* thread_handles;
/* Get number of threads from command line */
if (argc != 2) Usage(argv[0]);
thread_count = strtol(argv[1], NULL, 10);
if (thread_count <= 0 || thread_count > MAX_THREADS) Usage(argv[0]);
thread_handles = malloc (thread_count*sizeof(pthread_t));
for (thread = 0; thread < thread_count; thread++)
pthread_create(&thread_handles[thread], NULL, Hello, (void*) thread); …Run Code Online (Sandbox Code Playgroud) 从语法的角度来看,我已经看过"volatile"关键字在C++函数中有多少用法?关于在函数上使用volatile关键字,但没有明确解释该问题的案例1做了什么.只有一位受访者表示这似乎毫无意义/无用.
然而,我不能完全接受这种说法,因为GNUC的AES软件实现已经使用了几年,它们有许多这样的功能:
INLINE volatile void functionname( /* ... */ ) {
/* ... */
asm( /* ... */ ) // embedded assembly statements
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
必须有这种用法的原因.谁能:
一.告诉我原来的原因是什么; 和
乙.现在如何达到理想的效果?
我正在使用Ubuntu和GCC 4.6.3.
void fatal( /* ... */ ) { /* ... */ exit(1); }
typedef void voidfn ();
volatile voidfn fatal;
Run Code Online (Sandbox Code Playgroud)
这将允许编译器识别'致命'不会返回.
但是这种情况似乎不适用于AES代码.自从我在集会上做了很多事以来,已经有很长一段时间了,但我想我会认识到跳跃或类似的事情.
我得到了一段void()用作参数的代码.代码不编译......很明显?
我们可以实例化任何类型的东西void吗?我相信答案是否定的,除了a void*.例如:
void askVoid(void param) {}错误:参数可能没有
void类型
void askNaught() {}并使用askNaught(void())`错误调用它:错误C2660 ::
takeNaught函数不带1个参数
template <typename T> void takeGeneric(T param) {}并调用它有takeGeneric(void())错误:错误C2893:无法专门化功能模板
void takeGeneric(T)
void voidType错误:不允许使用不完整的类型
auto autoVoid = void()错误:不能推断出
auto类型
void* voidPtr工作正常,但remove_pointer_t<decltype(voidPtr)> decltypeVoid错误:错误C2182 ::
decltypeVoid非法使用类型void
就是这样,对吧?void()C++中没有地方可供选择吗?这只是我给出的错误代码,对吧?
我开始对C感到舒服,然后遇到了铸造.如果我在*.h文件中定义了以下内容
struct data {
int value;
char *label;
};
Run Code Online (Sandbox Code Playgroud)
这是另一个*.h文件
# define TYPE void*
Run Code Online (Sandbox Code Playgroud)
如何将void指针强制转换为struct,以便我可以使用传递给函数的变量"TYPE val"?例如,如果我想利用TYPE val指向的值,我该如何转换它以便我可以将该值传递给另一个函数?
我一直在关注米切尔,奥尔德姆和塞缪尔的高级Linux编程.我在pthreads一节中看到过一些关于void指针和转换的东西让我很困惑.
将参数传递给pthread_create(),它们不会将指针强制转换为void指针,即使这是函数所期望的.
pthread_create( &thread, NULL, &compute_prime, &which_prime );
Run Code Online (Sandbox Code Playgroud)
这里,which_prime的类型为int.
但是使用pthread_join从线程返回一个值,他们将变量转换为void指针.
pthread_join( thread, (void*) &prime );
Run Code Online (Sandbox Code Playgroud)
这里,prime再次为int类型.
为什么在第二个实例中而不是在第一个实例中完成转换?
void在C++类型系统中是一个奇怪的疣.这是一个不完整的类型,无法完成,它有各种有关限制方式的魔术规则:
类型cv
void是不完整的类型,无法完成; 这种类型有一组空值.它用作不返回值的函数的返回类型.任何表达式都可以显式转换为cvvoid([expr.cast]).类型的表达式CVvoid应仅作为一个表达式语句,作为逗号表达式的操作数,作为一个第二或第三操作数?:([expr.cond]),作为操作数typeid,noexcept或decltype,如在表达return具有返回类型cv 的函数的语句void,或作为显式转换为cv 类型的操作数的语句void.
(N4778,[basic.fundamental]9)
除了对所有这些奇怪规则的痒感之外,由于它的使用方式有限,在编写模板时经常会出现一个痛苦的特殊情况; 通常情况下,我们希望它表现得更像std::monostate.
让我们想象一下,除了上面的引文,标准说的void是类似的东西
这是一个定义相当于以下类型的类型:
Run Code Online (Sandbox Code Playgroud)struct void { void()=default; template<typename T> explicit void(T &&) {}; // to allow cast to void };
保持void *魔法 - 可以别名任何对象,数据指针必须在往返过程中存活void *.
这个:
void"适当"类型的现有用例;return …c++ language-design generic-programming void language-lawyer