标签: void

回归虚空?

我不明白为什么这段代码编译没有错误:

#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++ templates return void c++11

26
推荐指数
2
解决办法
1055
查看次数

decltype(void())中的void()究竟是什么意思?

这是对这个问题的跟进,更准确地说是这个答案的评论.

什么是void()decltype(void())代表什么呢?
它表示函数类型,表达式还是其他什么?

c++ void decltype language-lawyer c++11

24
推荐指数
2
解决办法
2255
查看次数

是否可以声明C++函数,以便不能忽略返回值?

我正在尝试确定是否可以以不能忽略返回值的方式声明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或更高版本的答案可以.

c++ return-value void

24
推荐指数
3
解决办法
1822
查看次数

"instanceof Void"总是返回false吗?

这种方法能true以某种方式返回吗?

public static <T> boolean isVoid(T t)
{
    return t instanceof Void;
}
Run Code Online (Sandbox Code Playgroud)

java generics instanceof void

23
推荐指数
2
解决办法
5897
查看次数

将int转换为void*或反之亦然意味着什么?

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)

c void

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

什么 - 或做 - "挥发性无效功能(......)"做什么?

从语法的角度来看,我已经看过"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.


注意: 我最接近解释的是,在GCC 2.5之前,您可以通过以下方式欺骗在2.5中实现的'noreturn'属性:

void fatal( /* ... */ ) { /* ... */ exit(1); }

typedef void voidfn ();

volatile voidfn fatal;
Run Code Online (Sandbox Code Playgroud)

这将允许编译器识别'致命'不会返回.

但是这种情况似乎不适用于AES代码.自从我在集会上做了很多事以来,已经有很长一段时间了,但我想我会认识到跳跃或类似的事情.

c function aes volatile void

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

建造一个空洞类型?

我得到了一段void()用作参数的代码.代码不编译......很明显?

我们可以实例化任何类型的东西void吗?我相信答案是否定的,除了a void*.例如:

  1. 编写函数void askVoid(void param) {}错误:

参数可能没有void类型

  1. 编写函数void askNaught() {}并使用askNaught(void())`错误调用它:

错误C2660 :: takeNaught函数不带1个参数

  1. 编写模板化函数template <typename T> void takeGeneric(T param) {}并调用它有takeGeneric(void())错误:

错误C2893:无法专门化功能模板 void takeGeneric(T)

  1. 声明void voidType错误:

不允许使用不完整的类型

  1. 声明auto autoVoid = void()错误:

不能推断出auto类型

  1. 声明void* voidPtr工作正常,但remove_pointer_t<decltype(voidPtr)> decltypeVoid错误:

错误C2182 :: decltypeVoid非法使用类型void

就是这样,对吧?void()C++中没有地方可供选择吗?这只是我给出的错误代码,对吧?

c++ void

21
推荐指数
3
解决办法
2025
查看次数

将void指针强制转换为struct

我开始对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指向的值,我该如何转换它以便我可以将该值传递给另一个函数?

c casting void

20
推荐指数
1
解决办法
6万
查看次数

什么时候在C中需要转换void指针?

我一直在关注米切尔,奥尔德姆和塞缪尔的高级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类型.

为什么在第二个实例中而不是在第一个实例中完成转换?

c pointers casting void

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

如果void实际定义为`struct void {};`,那么现有的C++代码会破坏多少

void在C++类型系统中是一个奇怪的疣.这是一个不完整的类型,无法完成,它有各种有关限制方式的魔术规则:

类型cv void是不完整的类型,无法完成; 这种类型有一组空值.它用作不返回值的函数的返回类型.任何表达式都可以显式转换为cv void([expr.cast]).类型的表达式CV void应仅作为一个表达式语句,作为逗号表达式的操作数,作为一个第二或第三操作数?:([expr.cond]),作为操作数typeid,noexceptdecltype,如在表达return具有返回类型cv 的函数的语句void,或作为显式转换为cv 类型的操作数的语句void.

(N4778,[basic.fundamental]9)

除了对所有这些奇怪规则的痒感之外,由于它的使用方式有限,在编写模板时经常会出现一个痛苦的特殊情况; 通常情况下,我们希望它表现得更像std::monostate.


让我们想象一下,除了上面的引文,标准说的void是类似的东西

这是一个定义相当于以下类型的类型:

struct void {
    void()=default;
    template<typename T> explicit void(T &&) {}; // to allow cast to void
};
Run Code Online (Sandbox Code Playgroud)

保持void *魔法 - 可以别名任何对象,数据指针必须在往返过程中存活void *.

这个:

  • 应涵盖void"适当"类型的现有用例;
  • 可能允许删除关于它通过标准传播的相当数量的垃圾 - 例如[expr.cond]2可能是不需要的,[stmt.return]将大大简化(同时仍然保持"异常",return …

c++ language-design generic-programming void language-lawyer

20
推荐指数
1
解决办法
415
查看次数