______________________________________________________________________ 1 General [intro] ______________________________________________________________________ 1.1 Scope [intro.scope] 1 This International Standard specifies requirements for processors of the C++ programming language. The first such requirement is that they implement the language, and so this Standard also defines C++. Other requirements and relaxations of the first requirement appear at vari ous places within the Standard. 2 C++ is a general purpose programming language based on the C program ming language as described in ISO/IEC 9899 (_intro.refs_). In addi tion to the facilities provided by C, C++ provides additional data types, classes, templates, exceptions, inline functions, operator overloading, function name overloading, references, free store manage ment operators, function argument checking and type conversion, and additional library facilities. These extensions to C are summarized in _diff.c_. The differences between C++ and ISO C1) are summarized in _diff.iso_. The extensions to C++ since 1985 are summarized in _diff.c++_. 3 Clauses _lib.library_ through _lib.input.output_ (the library clauses) describe the Standard C++ library, which provides definitions for the following kinds of entities: macros (_cpp.replace_), values (_basic_), types (_dcl.name_, _dcl.meaning_), templates (_temp_), classes (_class_), functions (_dcl.fct_), and objects (_dcl.dcl_). 4 For classes and class templates, the library clauses specify partial definitions. Private members (_class.access_) are not specified, but each implementation shall supply them to complete the definitions according to the description in the library clauses. 5 For functions, function templates, objects, and values, the library clauses specifiy declarations. Implementations shall supply defini tions consistent with the descriptions in the library clauses. 6 The names defined in the library have namespace scope (_basic.namespace_). A C++ translation unit (_lex.phases_) obtains access to these names by including the appropriate standard library header (_cpp.include_). 7 The templates, classes, functions, and objects in the library have external linkage (_basic.link_). An implementation provides defini tions for standard library entities, as necessary, while combining translation units to form a complete C++ program (_lex.phases_). 1.2 Normative references [intro.refs] 1 The following standards contain provisions which, through reference in this text, constitute provisions of this International Standard. At the time of publication, the editions indicated were valid. All stan dards are subject to revision, and parties to agreements based on this International Standard are encouraged to investigate the possibility of applying the most recent editions of the standards indicated below. Members of IEC and ISO maintain registers of currently valid Interna tional Standards. --ANSI X3.172:1990, American National Dictionary for Information Pro cessing Systems. --ISO/IEC 9899:1990, C Standard --ISO/IEC 9899:1990/DAM 1, Amendment 1 to C Standard 2 The library described in Clause 7 of the C Standard and Clause 4 of Amendment 1 to the C standard is hereinafter called the Standard C Library.1) 1.3 Definitions [intro.defs] 1 For the purposes of this International Standard, the definitions given in ANSI X3/TR-1-82 and the following definitions apply. --argument: An expression in the comma-separated list bounded by the parentheses in a function call expression, a sequence of preprocess ing tokens in the comma-separated list bounded by the parentheses in a function-like macro invocation, the operand of throw, or an expression in the comma-separated list bounded by the angle brackets in a template instantiation. Also known as an actual argument or actual parameter. --diagnostic message: A message belonging to an implementation-defined subset of the implementation's message output. --dynamic type: The dynamic type of an expression is determined by its current value and can change during the execution of a program. If a pointer (_dcl.ptr_) whose static type is pointer to class B is pointing to an object of class D, derived from B (_class.derived_), the dynamic type of the pointer is pointer to D. References (_dcl.ref_) are treated similarly. --implementation-defined behavior: Behavior, for a correct program construct and correct data, that depends on the implementation and that each implementation shall document. The range of possible _________________________ 1) With the qualifications noted in clauses _lib.library_ through _lib.input.output_, and in subclause _diff.library_, the Standard C library is a subset of the Standard C++ library. behaviors is delineated by the standard. --implementation limits: Restrictions imposed upon programs by the implementation. --locale-specific behavior: Behavior that depends on local conventions of nationality, culture, and language that each implementation shall document. --multibyte character: A sequence of one or more bytes representing a member of the extended character set of either the source or the execution environment. The extended character set is a superset of the basic character set. --parameter: an object or reference declared as part of a function declaration or definition in the catch clause of an exception han dler that acquires a value on entry to the function or handler, an identifier from the comma-separated list bounded by the parentheses immediately following the macro name in a function-like macro defi nition, or a template-parameter. A function can be said to take arguments or to have parameters. Parameters are also known as a formal arguments or formal parameters. --signature: The signature of a function is the information about that function that participates in overload resolution (_over.match_): the types of its parameters and, if the function is a non-static member of a class, the CV-qualifiers (if any) on the function itself and whether the function is a direct member of its class or inher ited from a base class. --static type: The static type of an expression is the type (_basic.types_) resulting from analysis of the program without con sideration of execution semantics. It depends only on the form of the program and does not change. --undefined behavior: Behavior, such as might arise upon use of an erroneous program construct or of erroneous data, for which the standard imposes no requirements. Permissible undefined behavior ranges from ignoring the situation completely with unpredictable results, to behaving during translation or program execution in a documented manner characteristic of the environment (with or without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message). Note that many erroneous program constructs do not engender undefined behav ior; they are required to be diagnosed. --unspecified behavior: Behavior, for a correct program construct and correct data, that depends on the implementation. The range of pos sible behaviors is delineated by the standard. The implementation is not required to document which behavior occurs. _________________________ 2) Function signatures do not include return type, because that does not participate in overload resolution. Subclause _lib.definitions_ defines additional terms that are used only in the library clauses (_lib.library_-_lib.input.output_). 1.4 Syntax notation [syntax] 1 In the syntax notation used in this manual, syntactic categories are indicated by italic type, and literal words and characters in constant width type. Alternatives are listed on separate lines except in a few cases where a long set of alternatives is presented on one line, marked by the phrase one of. An optional terminal or nonterminal sym bol is indicated by the subscript opt, so { expressionopt } indicates an optional expression enclosed in braces. 2 Names for syntactic categories have generally been chosen according to the following rules: --X-name is a use of an identifier in a context that determines its meaning (e.g. class-name, typedef-name). --X-id is an identifier with no context-dependent meaning (e.g. qual ified-id). --X-seq is one or more X's without intervening delimiters (e.g. dec laration-seq is a sequence of declarations). --X-list is one or more X's separated by intervening commas (e.g. expression-list is a sequence of expressions separated by commas). 1.5 The C++ memory model [intro.memory] 1 The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to contain any member of the basic exe cution character set and is composed of a contiguous sequence of bits, the number of which is implementation-defined. The least significant bit is called the low-order bit; the most significant bit is called the high-order bit. The memory accessible to a C++ program is one or more contiguous sequences of bytes. Each byte (except perhaps regis ters) has a unique address. 1.6 The C++ object model [intro.object] 1 The constructs in a C++ program create, refer to, access, and manipu late objects. An object is a region of storage and, except for bit- fields (_class.bit_), occupies one or more contiguous bytes of stor age. An object is created by a definition (_basic.def_), by a new- expression (_expr.new_) or by the implementation (_class.temporary_) when needed. The properties of an object are determined when the object is created. An object can have a name (_basic_). An object has a storageduration which influences its lifetime (_basic.stc_). An object has a type (_basic.types_). The term object type refers to the type with which the object is created. The object's type determines the number of bytes that the object occupies and the interpretation of its content. Some objects are polymorphic (_class.virtual_); the implementation generates information carried in each such object that makes it possible to determine that object's type during program exe cution. For other objects, the meaning of the values found therein is determined by the type of the expressions (_expr_) used to access them. 2 Objects can contain other objects, called sub-objects. A sub-object can be a member sub-object (_class.mem_) or a base class sub-object (_class.derived_). An object that is not a sub-object of any other object is called a complete object. For every object x, there is some object called the complete object of x, determined as follows: --If x is a complete object, then x is the complete object of x. --Otherwise, the complete object of x is the complete object of the (unique) object that contains x. 3 C++ provides a variety of built-in types and several ways of composing new types from existing types. 4 Certain types have alignment restrictions. An object of one of those types shall appear only at an address that is divisible by a particu lar integer. 1.7 Processor compliance [intro.compliance] 1 Every conforming C++ processor shall, within its resource limits, accept and correctly execute well-formed C++ programs, and shall issue at least one diagnostic error message when presented with any ill- formed program that contains a violation of any diagnosable semantic rule or of any syntax rule, except as noted herein. 2 Well-formed C++ programs are those that are constructed according to the syntax rules, diagnosable semantic rules, and the One Definition Rule (_basic.def_). If a program is not well-formed but does not con tain any diagnosable errors, this Standard places no requirement on processors with respect to that program. 3 The set of diagnosable semantic rules consists of all semantic rules in this Standard except for those rules containing an explicit nota tion that no diagnostic is required. 1.8 Program execution [intro.execution] 1 The semantic descriptions in this Standard define a parameterized non deterministic abstract machine. This Standard places no requirement on the structure of conforming processors. In particular, they need not copy or emulate the structure of the abstract machine. Rather, conforming processors are required to emulate (only) the observable behavior of the abstract machine as explained below. 2 Certain aspects and operations of the abstract machine are described in this Standard as implementation defined (for example, sizeof(int)). These constitute the parameters of the abstract machine. Each imple mentation shall include documentation describing its characteristics and behavior in these respects, which documentation defines the instance of the abstract machine that corresponds to that implementa tion (referred to as the ``corresponding instance'' below). 3 Certain other aspects and operations of the abstract machine are described in this Standard as unspecified (for example, order of eval uation of arguments to a function). In each case the Standard defines a set of allowable behaviors. These define the nondeterministic aspects of the abstract machine. An instance of the abstract machine can thus have more than one possible execution sequence for a given program and a given input. 4 Certain other operations are described in this International Standard as undefined (for example, the effect of dereferencing the null pointer). 5 A conforming processor executing a well-formed program shall produce the same observable behavior as one of the possible execution sequences of the corresponding instance of the abstract machine with the same program and the same input. However, if any such execution sequence contains an undefined operation, this Standard places no requirement on the processor executing that program with that input (not even with regard to operations previous to the first undefined operation). 6 The observable behavior of the abstract machine is its sequence of reads and writes to volatile data and calls to library I/O functions.3) 7 Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects, which are changes in the state of the execution environment. Evaluation of an expression might produce side effects. At certain specified points in the execution sequence called sequence points, all side effects of previous evaluations shall be complete and no side effects of subsequent evaluations shall have taken place.4) 8 Once the execution of a function begins, no expressions from the call ing function are evaluated until execution of the called function is completed.5) _________________________ 3) An implementation can offer additional library I/O functions as an extension. Implementations that do so should treat calls to those functions as ``observable behavior'' as well. 4) Note that some aspects of sequencing in the abstract machine are unspecified; the preceding restriction upon side effects applies to that particular execution sequence in which the actual code is gener ated. 5) In other words, function executions do not interleave with each other. 9 In the abstract machine, all expressions are evaluated as specified by the semantics. An actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no needed side effects are produced (including any caused by calling a function or accessing a volatile object). 10When the processing of the abstract machine is interrupted by receipt of a signal, only the values of objects as of the previous sequence point may be relied on. Objects that may be modified between the pre vious sequence point and the next sequence point need not have received their correct values yet. 11An instance of each object with automatic storage duration is associ ated with each entry into its block. Such an object exists and retains its last-stored value during the execution of the block and while the block is suspended (by a call of a function or receipt of a signal). 12The least requirements on a conforming implementation are: --At sequence points, volatile objects are stable in the sense that previous evaluations are complete and subsequent evaluations have not yet occurred. --At program termination, all data written into files shall be identi cal to one of the possible results that execution of the program according to the abstract semantics would have produced. --The input and output dynamics of interactive devices shall take place in such a fashion that prompting messages actually appear prior to a program waiting for input. What constitutes an interac tive device is implementation-defined. --More stringent correspondences between abstract and actual semantics may be defined by each implementation. 13Define a full-expression as an expression that is not a subexpression of another expression. 14It is important to note that certain contexts in C++ cause the evalua tion of a full-expression that results from a syntactic construct other than expression(_expr.comma_). For example, in _dcl.init_ one syntax for initializer is ( expression-list ) but the resulting construct is a function-call upon a constructor function with expression-list as an argument list; such a function call is a full-expression. For another example in _dcl.init_, another syntax for initializer is = initializer-clause but again the resulting construct is a function-call upon a construc tor function with one assignment-expression as an argument; again, the function-call is a full-expression. 15Also note that the evaluation of a full-expression can include the evaluation of subexpressions that are not lexically part of the full- expression. For example, subexpressions involved in evaluating default argument expressions (_dcl.fct.default_) are considered to be created in the expression that calls the function, not the expression that defines the default argument. 16There is a sequence point at the completion of evaluation of each full-expression6). 17When calling a function (whether or not the function is inline), there is a sequence point after the evaluation of all function arguments (if any) which takes place before execution of any expressions or state ments in the function body. There is also a sequence point after the copying of a returned value and before the execution of any expres sions outside the function7). Several contexts in C++ cause evalua tion of a function call, even though no corresponding function-call syntax appears in the translation unit. For example, evaluation of a new expression invokes one or more allocation and constructor func tions; see _expr.new_. For another example, invocation of a conver sion function (_class.conv.fct_) can arise in contexts in which no function-call syntax appears. The sequence points at function-entry and function-exit (as described above) are features of the function- calls as evaluated, whatever the syntax of the translation unit might be. 18In the evaluation of each of the expressions a && b a || b a ? b : c a , b there is a sequence point after the evaluation of the first expression8). +------- BEGIN BOX 1 -------+ The contexts above all correspond to sequence points already specified in ISO C, although they can arise in new syntactic contexts. The _________________________ 6) As specified in _class.temporary_, after the "end-of-full- expression" sequence point, a sequence of zero or more invocations of destructor functions takes place, in reverse order of the construction of each temporary object. 7) The sequence point at the function return is not explicitly speci fied in ISO C, and can be considered redundant with sequence points at full-expressions, but the extra clarity is important in C++. In C++, there are more ways in which a called function can terminate its exe cution, such as the throw of an exception, as discussed below. 8) The operators indicated in this paragraph are the builtin opera tors, as described in Clause _expr_. When one of these operators is overloaded (_over_) in a valid context, thus designating a user- defined operator function, the expression designates a function invo cation, and the operands form an argument list, without an implied se quence point between them. Working Group is still discussing whether there is a sequence point after the operand of dynamic-cast is evaluated; this is a context from which an exception might be thrown, even though no function-call is performed. This has not yet been voted upon by the Working Group, and it may be redundant with the sequence point at function-exit. +------- END BOX 1 -------+