I was given a piece of code that uses void() as an argument. The code doesn't compile... obviously?
Can we instantiate anything of type void? I believed the answer was no, with the exception of a void*. For example:
void askVoid(void param) {} errors:A parameter may not have
voidtype
void askNaught() {} and calling it with askNaught(void())` errors:error C2660:
takeNaught: function does not take 1 arguments
template <typename T> void takeGeneric(T param) {} and calling it with takeGeneric(void()) errors:error C2893: Failed to specialize function template
void takeGeneric(T)
void voidType errors:Incomplete type is not allowed
auto autoVoid = void() errors:Cannot deduce
autotype
void* voidPtr works fine, but remove_pointer_t<decltype(voidPtr)> decltypeVoid errors:error C2182:
decltypeVoid: illegal use of typevoid
That's it, right? There is no place for void() in C++ is there? This is just bad code I've been given, right?
The void type, in several programming languages derived from C and Algol68, is the type for the result of a function that returns normally, but does not provide a result value to its caller. Usually such functions are called for their side effects, such as performing some task or writing to their output parameters.
Introduction to TypeScript void type The void type denotes the absence of having any type at all. It is a little like the opposite of the any type. Typically, you use the void type as the return type of functions that do not return a value.
When used as a function return type, the void keyword specifies that the function doesn't return a value. When used for a function's parameter list, void specifies that the function takes no parameters.
A void return type simply means nothing is returned. System. out. println does not return anything as it simply prints out the string passed to it as a parameter.
C++ (and I say C++, not C) allows (§6.6.3 comma 2) functions with void return type to return a void expression, that is:
void foo() { return void(); }
But notice it is not constructing a temporary void!
The expression void() is a prvalue of type void and can be used anywhere such an expression may be used, which [basic.fundamental]/9 helpfully provides a list:
void();
true ? throw 1 : void()
++it1, void(), ++it2
decltype or noexcept: using my_void = decltype(void()); static_assert(noexcept(void()), "WAT");
return statement of a function returning (possibly cv-qualified) void: const void f() { return void(); }
void: static_cast<const void>(void())
An expression of type void can also be used as the operand of typeid, but void() in particular would be parsed as a type, not an expression, in this context.
You can take a void() as function parameter:
void test(void()) { ... }
Which expands to:
void test(void (*)())
Which is a function pointer to a method which returns void and takes no arguments.
Full example:
void abc() {}
void test(void()) { }
int main() {
test(abc);
}
You can use void() as a callable type, as an example std::function<void()> f; is a valid statement.
Moreover, as from 8.3.5/4:
A parameter list consisting of a single unnamed parameter of non-dependent type void is equivalent to an empty parameter list.
That means that this is valid:
template<typename T>
struct F;
template<typename R, typename... A>
struct F<R(A...)> { };
int main () {
F<void(void)> s;
}
Here you are not instantiating anything of type void, but you are using it (let me say) as a parameter list of a callable type.
Not sure if this replies to your question, I've not clear what the question actually is.
There is no place for void() in C++ is there?
As an expression, void() is valid in C++.
From the standard, $5.2.3/2 Explicit type conversion (functional notation) [expr.type.conv]:
The expression
T(), whereTis a simple-type-specifier or typename-specifier for a non-array complete object type or the (possibly cv-qualified)voidtype, creates a prvalue of the specified type, whose value is that produced by value-initializing (8.5) an object of typeT; no initialization is done for thevoid()case.
From cppreference.com:
new_type ( )
If
new_typeis an object type, the object is value-initialized; otherwise, no initialization is done. Ifnew_typeis (possibly cv-qualified)void, the expression is avoidprvalue.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With