我甚至都不知道这是可行的,但我在网上浏览了一些带有如下签名的方法:
public List<Void> read( ... )
Run Code Online (Sandbox Code Playgroud)
... 什么?有没有理由这样做?这List甚至可以举办什么?据我所知,实例化一个Void对象是不可能的.
我编写了以下代码,以查看a shared_ptr<void>作为最后引用a shared_ptr<Thing>并被销毁时的行为。
#include <iostream>
#include <string>
#include <memory>
using namespace std;
struct Thing{
~Thing(){
cout<<"Destroyed\n";
}
int data;
};
int main(){
{
shared_ptr<void> voidPtr;
{
shared_ptr<Thing> thingPtr = make_shared<Thing>();
voidPtr = thingPtr;
}
cout<<"thingPtr is dead\n";
}
cout<<"voidPtr is dead\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:
thingPtr is dead
Destroyed
voidPtr is dead
Run Code Online (Sandbox Code Playgroud)
它以我喜欢的方式运行,但是这完全是出乎意料的,我想了解这里发生了什么。最初的共享指针不再存在,最后只是一个shared_ptr<void>。因此,我希望这个共享指针的行为就像它持有a void*并且不知道有关Thing::~Thing(),但是它称之为。这是设计使然吧?void共享指针如何做到这一点?
在C中,我知道int main()返回一个int,其中void main()没有.除此之外,他们之间有区别吗?第一个好于第二个?
我有一个myobject可能会返回的对象None.如果返回None,则不会返回属性id:
a = myobject.id
Run Code Online (Sandbox Code Playgroud)
所以当myobject是None,上面的结果导致AttributeError:
AttributeError: 'NoneType' object has no attribute 'id'
Run Code Online (Sandbox Code Playgroud)
如果myobject是None,那么我想a等于None.如何在一行语句中避免此异常,例如:
a = default(myobject.id, None)
Run Code Online (Sandbox Code Playgroud) 当 switch 分支调用具有 void 返回类型的方法时,有没有办法强制对所有枚举值进行彻底检查?仅仅为了诱使编译器要求穷举而对产量进行硬编码是非常丑陋的。
这是我当前的模式(句柄方法具有 void 返回类型)
int unused = switch (event.getEventType()) {
case ORDER -> { handle((OrderEvent) event); yield 0; }
case INVOICE -> { handle((InvoiceEvent) event); yield 0; }
case PAYMENT -> { handle((PaymentEvent) event); yield 0; }
};
Run Code Online (Sandbox Code Playgroud)
我想使用表达式的原因是在添加新枚举值但未处理时出现编译错误。
我碰巧实现了一个void followlink(obj page,obj link)简单地添加页面和链接到队列的方法.我试图测试这种方法是不成功的.
我想要的是测试队列中包含从followlink方法收到的页面和链接.我的测试类已经扩展了TestCase.那么测试这种方法的最佳方法是什么?
我在扩展的asynctask中得到了这个错误,但我确定Object []是一个Void [].
这是我的自定义AsyncTask:
public abstract class RepeatableAsyncTask<A, B, C> extends AsyncTask<A, B, C> {
private static final String TAG = "RepeatableAsyncTask";
public static final int DEFAULT_MAX_RETRY = 5;
private int mMaxRetries = DEFAULT_MAX_RETRY;
private Exception mException = null;
/**
* Default constructor
*/
public RepeatableAsyncTask() {
super();
}
/**
* Constructs an AsyncTask that will repeate itself for max Retries
* @param retries Max Retries.
*/
public RepeatableAsyncTask(int retries) {
super();
mMaxRetries = retries;
}
/**
* Will be …Run Code Online (Sandbox Code Playgroud) 经常使用的语句(void)x;允许禁止有关未使用变量的警告x.但是如果我尝试编译以下内容,我会得到一些我不太了解的结果:
int main()
{
int x;
(short)x;
(void)x;
(int)x;
}
Run Code Online (Sandbox Code Playgroud)
用g ++编译它,我得到以下警告:
$ g++ test.cpp -Wall -Wextra -o test
test.cpp: In function ‘int main()’:
test.cpp:4:13: warning: statement has no effect [-Wunused-value]
(short)x;
^
test.cpp:6:11: warning: statement has no effect [-Wunused-value]
(int)x;
^
Run Code Online (Sandbox Code Playgroud)
因此,我得出结论,转换为void与任何其他类型的转换非常不同,是目标类型相同decltype(x)或不同的东西.我猜测可能的解释是:
(void)x;但其他演员不会抑制警告.所有陈述同样没有任何效果.void x;并非如此short x;.哪一项更正确?如果没有,那么如何解释编译器警告的差异?
这是这个问题的后续行动.
评价和在回答据说超过一次,更多的void{}是没有一个有效的类型-ID,也不是一个有效的表达式.
这很好,它是有道理的,这就是全部.
然后我通过工作草案的[7.1.7.4.1/2](占位符类型扣除).
有人说:
[...]
- 对于使用return包含占位符类型的返回类型声明的函数中发生的非丢弃 语句,T是声明的返回类型,并且e是return语句的操作数 .如果return语句没有操作数,那么e是void{};
[...]
那么,void{}(概念上)合法与否?
如果它在工作草案中提到是可接受的(尽管只是作为- 如果它是一个 -陈述),它必须是合法的.这意味着它也decltype(void{})应该是有效的,作为一个例子.
否则,工作草案应该使用void()而不是void{}?
嗯,说实话,我很确定我没有足够的技巧来指出工作草案中的错误,所以真正的问题是:我的推理出了什么问题?上面的子弹中提到了
什么void{},以及为什么在这种情况下它是一个法律表达?
Void类是一个不可实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用.
但构造函数很简单:
private Void() {}
Run Code Online (Sandbox Code Playgroud)
这段代码实例化了一个Void:
Constructor<Void> c = Void.class.getDeclaredConstructor();
c.setAccessible(true);
Void v = c.newInstance(); // Hello sailor
Run Code Online (Sandbox Code Playgroud)
所以Void是不是不可实例.
是否有办法让Void真正无法实现?
void ×10
java ×5
c++ ×3
reflection ×2
android ×1
attributes ×1
c ×1
c++17 ×1
casting ×1
default ×1
generics ×1
int ×1
java-16 ×1
junit ×1
list ×1
python ×1
shared-ptr ×1
unit-testing ×1