Istream(zstring p, Opt) : owned{true}, inp{new istringstream{p}} {} // read from command line
Istream(czstring p, Opt) : owned{true}, inp{new istringstream{p}} {} // read from command line
~Istream() { if (owned) delete inp; }
~Istream() { if (owned) delete inp; }
operator istream&() { return *inp; }
operator istream&() { return *inp; }
private:
private:
@ -3188,7 +3188,7 @@ A `struct` of many (individually cheap-to-move) elements might be in aggregate e
##### Exceptions
##### Exceptions
* For non-concrete types, such as types in an inheritance hierarchy, return the object by `unique_ptr` or `shared_ptr`.
* For non-concrete types, such as types in an inheritance hierarchy, return the object by `unique_ptr` or `shared_ptr`.
* If a type is expensive to move (e.g., `array<BigPOD>`), consider allocating it on the free store and return a handle (e.g., `unique_ptr`), or passing it in a reference to non-`const` target object to fill (to be used as an out-parameter).
* If a type is expensive to move (e.g., `array<BigTrivial>`), consider allocating it on the free store and return a handle (e.g., `unique_ptr`), or passing it in a reference to non-`const` target object to fill (to be used as an out-parameter).
* To reuse an object that carries capacity (e.g., `std::string`, `std::vector`) across multiple calls to the function in an inner loop: [treat it as an in/out parameter and pass by reference](#Rf-out-multi).
* To reuse an object that carries capacity (e.g., `std::string`, `std::vector`) across multiple calls to the function in an inner loop: [treat it as an in/out parameter and pass by reference](#Rf-out-multi).
##### Example
##### Example
@ -3301,7 +3301,7 @@ To compare, if we passed out all values as return values, we would something lik
return {in, move(s)};
return {in, move(s)};
}
}
for (auto p = get_string(cin); p.first; ) {
for (auto p = get_string(cin); p.first; p.second = get_string(p.first).second) {
// do something with p.second
// do something with p.second
}
}
@ -6438,9 +6438,11 @@ A non-throwing move will be used more efficiently by standard-library and langua
* [SF.10: Avoid dependencies on implicitly `#include`d names](#Rs-implicit)
* [SF.10: Avoid dependencies on implicitly `#include`d names](#Rs-implicit)
* [SF.11: Header files should be self-contained](#Rs-contained)
* [SF.11: Header files should be self-contained](#Rs-contained)
* [SF.12: Prefer the quoted form of `#include` for files relative to the including file and the angle bracket form everywhere else](#Rs-incform)
* [SF.12: Prefer the quoted form of `#include` for files relative to the including file and the angle bracket form everywhere else](#Rs-incform)
* [SF.13: Use portable header identifiers in `#include` statements](#Rs-portable-header-id)
* [SF.20: Use `namespace`s to express logical structure](#Rs-namespace)
* [SF.20: Use `namespace`s to express logical structure](#Rs-namespace)
* [SF.21: Don't use an unnamed (anonymous) namespace in a header](#Rs-unnamed)
* [SF.21: Don't use an unnamed (anonymous) namespace in a header](#Rs-unnamed)
@ -19618,7 +19632,7 @@ Nevertheless, the guidance is to use the quoted form for including files that ex
#include<string> // From the standard library, requires the <> form
#include<string> // From the standard library, requires the <> form
#include<some_library/common.h> // A file that is not locally relative, included from another library; use the <> form
#include<some_library/common.h> // A file that is not locally relative, included from another library; use the <> form
#include "foo.h" // A file locally relative to foo.cpp in the same project, use the "" form
#include "foo.h" // A file locally relative to foo.cpp in the same project, use the "" form
#include "foo_utils/utils.h" // A file locally relative to foo.cpp in the same project, use the "" form
#include "util/util.h" // A file locally relative to foo.cpp in the same project, use the "" form
#include<component_b/bar.h> // A file in the same project located via a search path, use the <> form
#include<component_b/bar.h> // A file in the same project located via a search path, use the <> form
##### Note
##### Note
@ -19631,6 +19645,34 @@ Library creators should put their headers in a folder and have clients include t
A test should identify whether headers referenced via `""` could be referenced with `<>`.
A test should identify whether headers referenced via `""` could be referenced with `<>`.
### <aname="Rs-portable-header-id"></a>SF.13: Use portable header identifiers in `#include` statements
##### Reason
The [standard](http://eel.is/c++draft/cpp.include) does not specify how compilers uniquely locate headers from an identifier in an `#include` directive, nor does it specify what constitutes uniqueness. For example, whether the implementation considers the identifiers to be case-sensitive, or whether the identifiers are file system paths to a header file, and if so, how a hierarchical file system path is delimited.
To maximize the portability of `#include` directives across compilers, guidance is to:
* use case-sensitivity for the header identifier, matching how the header is defined by the standard, specification, implementation, or file that provides the header.
* when the header identifier is a hierarchical file path, use forward-slash `/` to delimit path components as this is the most widely-accepted path-delimiting character.
##### Example
// good examples
#include<vector>
#include<string>
#include "util/util.h"
// bad examples
#include<VECTOR> // bad: the standard library defines a header identified as <vector>, not <VECTOR>
#include<String> // bad: the standard library defines a header identified as <string>, not <String>
#include "Util/Util.H" // bad: the header file exists on the file system as "util/util.h"
#include "util\util.h" // bad: may not work if the implementation interprets `\u` as an escape sequence, or where '\' is not a valid path separator
##### Enforcement
It is only possible to enforce on implementations where header identifiers are case-sensitive and which only support `/` as a file path delimiter.
### <aname="Rs-namespace"></a>SF.20: Use `namespace`s to express logical structure
### <aname="Rs-namespace"></a>SF.20: Use `namespace`s to express logical structure
##### Reason
##### Reason
@ -21594,7 +21636,8 @@ ISO Standard, use lower case only and digits, separate words with underscores:
* `vector`
* `vector`
* `my_map`
* `my_map`
Avoid double underscores `__`.
Avoid identifier names that contain double underscores `__` or that start with an underscore followed by a capital letter (e.g., `_Throws`).
Such identifiers are reserved for the C++ implementation.
##### Example
##### Example
@ -21643,7 +21686,7 @@ To avoid confusing macros with names that obey scope and type rules.
##### Note
##### Note
This rule applies to non-macro symbolic constants:
In particular, this avoids confusing macros with non-macro symbolic constants (see also [Enum.5: Don't use `ALL_CAPS` for enumerators](#Renum-caps))