我在阅读pugixml源代码时看到它,我真的不知道为什么会这样.
void foo(void* ptr) {
(void)!ptr; // What does this line do?
}
Run Code Online (Sandbox Code Playgroud) 为什么以下程序
#include <iostream>
struct C
{
operator int()
{
std::cout << "C::operator int()" << std::endl;
return 0;
}
operator void()
{
std::cout << "C::operator void()" << std::endl;
}
};
int main()
{
C c;
(int)c;
(void)c;
// this does run the function:
// c.operator void();
}
Run Code Online (Sandbox Code Playgroud)
输出这个
C::operator int()
Run Code Online (Sandbox Code Playgroud)
而不是这个?
C::operator int()
C::operator void()
Run Code Online (Sandbox Code Playgroud)
一如既往,直接的回答是"因为标准是这么说的".
C++ 11标准,§12.3.2
转换函数从不用于将(可能是cv限定的)对象转换为(可能是cv限定的)相同的对象类型(或对它的引用),转换为该类型的(可能是cv限定的)基类(或引用它)或(可能是cv-qualified)void.
那么为什么标准会这样说呢?使空洞转换功能成为特殊情况有什么好处?
其他说明见脚注116:
这些转换被视为标准转换,用于重载解析(13.3.3.1,13.3.3.1.4),因此初始化(8.5)和显式转换(5.2.9).转换为void不会调用任何转换函数(5.2.9).即使从未直接调用执行转换,也可以声明此类转换函数,并且可以通过调用基类中的虚拟转换函数来实现.
我只是习惯于(void)对有关未使用变量的编译器警告进行静音.它看起来基本上也是其他人使用它的东西.
如果void转换函数遵循典型的转换函数规则,则可能会出现意外情况,但对于任何具有副作用的转换函数而言都是如此,并且创建这些意外将由程序员自行决定.
可能重复:
将未使用的返回值转换为void
我读了一些源代码,并在其中声明了接口类中的许多虚函数,并默认实现如下:
virtual bool FunctionName(TypeName* pointer)
{
(void)pointer;
return true;
}
Run Code Online (Sandbox Code Playgroud)
请问在默认实现中将指针转换为void的目的是什么?
当main()调用一个返回值为某种数据类型(原始或用户定义)的函数时,调用该函数的语句"通常"是一个赋值.
例如: -
class complex
{
private:
int real;
int imag;
public:
complex();
complex(int r,int i);
complex operator + (complex c);
};
Run Code Online (Sandbox Code Playgroud)
假设,我的重载"+"的定义是这样的 -
complex complex::operator + (complex c)
{
this->real = this->real + c.real;
this->imag = this->imag + c.imag;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
我的主要功能如下 -
int main()
{
complex c1;
complex c2(5,4);
c1+c2;
}
Run Code Online (Sandbox Code Playgroud)
在上面的main()中,考虑语句c1 + c2.编译器将其视为c1.operator +(c2).当main调用此函数时,它会向main()返回一个值.这个返回值会发生什么变化?
我正在阅读一些源代码,然后出现了这个问题;
struct Cookie *
Curl_cookie_add(struct SessionHandle *data, /* rest of params were here */)
{
/* unrelated things were here */
#ifdef CURL_DISABLE_VERBOSE_STRINGS
(void)data;
#endif
/* rest of function goes here */
}
Run Code Online (Sandbox Code Playgroud)
如您所见,void cast 指针甚至没有分配给变量。我想知道这样做的目的是什么。
我正在检查代码,我遇到了以下代码段:
int check(char *a)
{
(void)(a);//What is this line doing??
return 0;
}
int main(void)
{
char *p;
p=(char *)malloc(sizeof(char));
check(p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在(void)(a);做什么?
我在示例程序中遇到了以下行,并且不知道它是什么.我想这是一个函数调用,但我不确定:
(void) pthread_mutex_init(&bottleneck, &mxattr);
Run Code Online (Sandbox Code Playgroud)
如果是函数调用,为什么它以(void)开头?我以前从未见过这个.这是更多背景下的界限:
attr_init(pthread_process, pthread_scope, stacksize);
(void) pthread_mutex_init(&bottleneck, &mxattr);
barrier_init(&setup_barrier, (2 * ntables) + 1);
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助.整个程序来自本Solaris白皮书(附录D)
在使用CMake 下载并构建GDCM代码后,我偶然发现了这个问题:
void error_callback(const char *msg, void *) {
(void)msg;
gdcmErrorMacro( "Error in gdcmopenjpeg" << msg );
}
Run Code Online (Sandbox Code Playgroud)
第一行有什么作用?从来没有见过这样的东西.请记住,如果重要的话,我告诉CMake使用Visual Studio 2010进行构建.
static_cast<void>()是编写void转换的'C++方式'
在en.cppreference.com网站上提到丢弃表达式的值.在下面链接解释部分的四个点
http://en.cppreference.com/w/cpp/language/static_cast
我们应该在哪里和为什么使用static_cast<void>()?举个例子..
由于'fd'没有返回,它后来如何读/写?
例如:
void init(void)
{
....
(void) open("/dev/tty1",O_RDWR,0);
....
Run Code Online (Sandbox Code Playgroud)