Doc. No.: | N4309 |
---|---|
Date: | 2014-11-17 |
Project: | Programming Language C++, Evolution Working Group |
Reply To: | Michael Price <[email protected]> |
Proposes to allow auto
and declspec(auto)
as the type-specifiers for the return type of explicitly-defaulted
and deleted special member functions. It seems this case was left out of
N3638.
Paragraph 7.1.6.4, clause 2 of the draft standard (N4141) states:
The placeholder type can appear with a function declarator in the decl-specifier-seq, type-specifier-seq, conversion-function-id, or trailing-return-type, in any context where such a declarator is valid. If the function declarator includes a trailing-return-type (8.3.5), that specifies the declared return type of the function. If the declared return type of the function contains a placeholder type, the return type of the function is deduced from
return
statements in the body of the function, if any.
This wording allows the usage of auto
or declspec(auto)
in a function definition, only if there is a trailing return type or a
function body that contains at least one return
statement that can be used to deduce the return type. This proposal would
allow the placeholder type-specifiers to be valid for special member functions
that are explicitly-defaulted or deleted.
struct VersionOne
{
VersionOne() = default;
~VersionOne() = default;
VersionOne(const VersionOne&) = default;
VersionOne(VersionOne&&) = default;
VersionOne& operator=(const VersionOne&) = default;
VersionOne& operator=(VersionOne&&) = default;
};
// For some reason, the author decided that I wanted non-default
// copy operations and thought it would be nice to throw in 'auto'.
//
struct VersionTwo
{
VersionTwo() = default;
~VersionTwo() = default;
VersionTwo(const VersionTwo&) { /* ... */ }
VersionTwo(VersionTwo&&) = default;
auto operator=(const VersionTwo&) { /* ... */ return *this; }
auto operator=(VersionTwo&&) = default; // Currently an error!
};
This paper is looking for guidance on whether this feature should be pursued. It provides no wording.