208 lines
11 KiB
Markdown
208 lines
11 KiB
Markdown
[module.unit]
|
||
|
||
# 10 Modules [[module]](./#module)
|
||
|
||
## 10.1 Module units and purviews [module.unit]
|
||
|
||
[module-declaration:](#nt:module-declaration "10.1 Module units and purviews [module.unit]")
|
||
export-keywordopt module-keyword [*module-name*](#nt:module-name "10.1 Module units and purviews [module.unit]") [*module-partition*](#nt:module-partition "10.1 Module units and purviews [module.unit]")opt [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt ;
|
||
|
||
[module-name:](#nt:module-name "10.1 Module units and purviews [module.unit]")
|
||
[*module-name-qualifier*](#nt:module-name-qualifier "10.1 Module units and purviews [module.unit]")opt [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")
|
||
|
||
[module-partition:](#nt:module-partition "10.1 Module units and purviews [module.unit]")
|
||
: [*module-name-qualifier*](#nt:module-name-qualifier "10.1 Module units and purviews [module.unit]")opt [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")
|
||
|
||
[module-name-qualifier:](#nt:module-name-qualifier "10.1 Module units and purviews [module.unit]")
|
||
[*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") .
|
||
[*module-name-qualifier*](#nt:module-name-qualifier "10.1 Module units and purviews [module.unit]") [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") .
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L29)
|
||
|
||
A [*module unit*](#def:module_unit "10.1 Module units and purviews [module.unit]") is a translation unit that contains
|
||
a [*module-declaration*](#nt:module-declaration "10.1 Module units and purviews [module.unit]")[.](#1.sentence-1)
|
||
|
||
A [*named module*](#def:module,named "10.1 Module units and purviews [module.unit]") is the
|
||
collection of module units with the same [*module-name*](#nt:module-name "10.1 Module units and purviews [module.unit]")[.](#1.sentence-2)
|
||
|
||
The identifiers module and import shall not appear as [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")*s* in a [*module-name*](#nt:module-name "10.1 Module units and purviews [module.unit]") or [*module-partition*](#nt:module-partition "10.1 Module units and purviews [module.unit]")[.](#1.sentence-3)
|
||
|
||
All [*module-name*](#nt:module-name "10.1 Module units and purviews [module.unit]")*s* either beginning with an [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") consisting of std followed by zero or more [*digit*](lex.name#nt:digit "5.11 Identifiers [lex.name]")*s* or
|
||
containing a reserved identifier ([[lex.name]](lex.name "5.11 Identifiers"))
|
||
are reserved and shall not be specified in a [*module-declaration*](#nt:module-declaration "10.1 Module units and purviews [module.unit]");
|
||
no diagnostic is required[.](#1.sentence-4)
|
||
|
||
If any [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") in a reserved [*module-name*](#nt:module-name "10.1 Module units and purviews [module.unit]") is a reserved identifier,
|
||
the module name is reserved for use by C++ implementations;
|
||
otherwise it is reserved for future standardization[.](#1.sentence-5)
|
||
|
||
The optional [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]") appertains to the [*module-declaration*](#nt:module-declaration "10.1 Module units and purviews [module.unit]")[.](#1.sentence-6)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L50)
|
||
|
||
A [*module interface unit*](#def:module_interface_unit "10.1 Module units and purviews [module.unit]") is a module unit whose[*module-declaration*](#nt:module-declaration "10.1 Module units and purviews [module.unit]") starts with *export-keyword*;
|
||
any other module unit is a [*module implementation unit*](#def:module_implementation_unit "10.1 Module units and purviews [module.unit]")[.](#2.sentence-1)
|
||
|
||
A named module shall contain exactly one module interface unit
|
||
with no [*module-partition*](#nt:module-partition "10.1 Module units and purviews [module.unit]"), known as the[*primary module interface unit*](#def:primary_module_interface_unit "10.1 Module units and purviews [module.unit]") of the module;
|
||
no diagnostic is required[.](#2.sentence-2)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L59)
|
||
|
||
A [*module partition*](#def:module_partition "10.1 Module units and purviews [module.unit]") is
|
||
a module unit whose [*module-declaration*](#nt:module-declaration "10.1 Module units and purviews [module.unit]") contains
|
||
a [*module-partition*](#nt:module-partition "10.1 Module units and purviews [module.unit]")[.](#3.sentence-1)
|
||
|
||
A named module shall not contain multiple module partitions with
|
||
the same [*module-partition*](#nt:module-partition "10.1 Module units and purviews [module.unit]")[.](#3.sentence-2)
|
||
|
||
All module partitions of a module
|
||
that are module interface units
|
||
shall be directly or indirectly exported
|
||
by the primary module interface unit ([[module.import]](module.import "10.3 Import declaration"))[.](#3.sentence-3)
|
||
|
||
No diagnostic is required for a violation of these rules[.](#3.sentence-4)
|
||
|
||
[*Note [1](#note-1)*:
|
||
|
||
Module partitions can be imported only by
|
||
other module units in the same module[.](#3.sentence-5)
|
||
|
||
The division of a module into module units
|
||
is not visible outside the module[.](#3.sentence-6)
|
||
|
||
â *end note*]
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L77)
|
||
|
||
[*Example [1](#example-1)*:
|
||
|
||
Translation unit #1:export module A;export import :Foo;export int baz();
|
||
|
||
Translation unit #2:export module A:Foo;import :Internals;export int foo() { return 2 * (bar() + 1); }
|
||
|
||
Translation unit #3:module A:Internals;int bar();
|
||
|
||
Translation unit #4:module A;import :Internals;int bar() { return baz() - 10; }int baz() { return 30; }
|
||
|
||
Module A contains four translation units:
|
||
|
||
- [(4.1)](#4.1)
|
||
|
||
a primary module interface unit,
|
||
|
||
- [(4.2)](#4.2)
|
||
|
||
a module partition A:Foo, which is a module interface unit
|
||
forming part of the interface of module A,
|
||
|
||
- [(4.3)](#4.3)
|
||
|
||
a module partition A:Internals, which does not contribute
|
||
to the external interface of module A, and
|
||
|
||
- [(4.4)](#4.4)
|
||
|
||
a module implementation unit providing
|
||
a definition of bar and baz,
|
||
which cannot be imported because
|
||
it does not have a partition name[.](#4.sentence-1)
|
||
|
||
â *end example*]
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L117)
|
||
|
||
A [*module unit purview*](#def:purview,module_unit "10.1 Module units and purviews [module.unit]") is
|
||
the sequence of [*token*](lex.token#nt:token "5.10 Tokens [lex.token]")*s* starting at the [*module-declaration*](#nt:module-declaration "10.1 Module units and purviews [module.unit]") and extending to the end of the translation unit[.](#5.sentence-1)
|
||
|
||
The [*purview*](#def:purview,named_module "10.1 Module units and purviews [module.unit]") of a named module M is the set of module unit purviews
|
||
of M's module units[.](#5.sentence-2)
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L126)
|
||
|
||
The [*global module*](#def:module,global "10.1 Module units and purviews [module.unit]") is the collection of all[*global-module-fragment*](module.global.frag#nt:global-module-fragment "10.4 Global module fragment [module.global.frag]")*s* and all translation units that are not module units[.](#6.sentence-1)
|
||
|
||
Declarations appearing in such a context
|
||
are said to be in the [*purview*](#def:purview,global_module "10.1 Module units and purviews [module.unit]") of the global module[.](#6.sentence-2)
|
||
|
||
[*Note [2](#note-2)*:
|
||
|
||
The global module has no name, no module interface unit, and is not
|
||
introduced by any [*module-declaration*](#nt:module-declaration "10.1 Module units and purviews [module.unit]")[.](#6.sentence-3)
|
||
|
||
â *end note*]
|
||
|
||
[7](#7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L137)
|
||
|
||
A [*module*](#def:module "10.1 Module units and purviews [module.unit]") is either a named module or the global module[.](#7.sentence-1)
|
||
|
||
A declaration is [*attached*](#def:attached,declaration "10.1 Module units and purviews [module.unit]") to a module as follows:
|
||
|
||
- [(7.1)](#7.1)
|
||
|
||
If the declaration is a non-dependent friend declaration
|
||
that nominates a function with a [*declarator-id*](dcl.decl.general#nt:declarator-id "9.3.1 General [dcl.decl.general]") that is a [*qualified-id*](expr.prim.id.qual#nt:qualified-id "7.5.5.3 Qualified names [expr.prim.id.qual]") or [*template-id*](temp.names#nt:template-id "13.3 Names of template specializations [temp.names]") or
|
||
that nominates a class
|
||
other than with an [*elaborated-type-specifier*](dcl.type.elab#nt:elaborated-type-specifier "9.2.9.5 Elaborated type specifiers [dcl.type.elab]") with neither
|
||
a [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]") nor a [*simple-template-id*](temp.names#nt:simple-template-id "13.3 Names of template specializations [temp.names]"),
|
||
it is attached to the module to which the friend is attached ([[basic.link]](basic.link "6.7 Program and linkage"))[.](#7.1.sentence-1)
|
||
|
||
- [(7.2)](#7.2)
|
||
|
||
Otherwise, if the declaration
|
||
* [(7.2.1)](#7.2.1)
|
||
|
||
declares a namespace whose name has external linkage,
|
||
|
||
* [(7.2.2)](#7.2.2)
|
||
|
||
declares a type alias,
|
||
|
||
* [(7.2.3)](#7.2.3)
|
||
|
||
declares a namespace alias, or
|
||
|
||
* [(7.2.4)](#7.2.4)
|
||
|
||
appears within a [*linkage-specification*](dcl.link#nt:linkage-specification "9.12 Linkage specifications [dcl.link]") ([[dcl.link]](dcl.link "9.12 Linkage specifications"))
|
||
|
||
it is attached to the global module[.](#7.2.sentence-1)
|
||
|
||
- [(7.3)](#7.3)
|
||
|
||
Otherwise, the declaration is
|
||
attached to the module in whose purview it appears[.](#7.3.sentence-1)
|
||
|
||
[8](#8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L162)
|
||
|
||
A [*module-declaration*](#nt:module-declaration "10.1 Module units and purviews [module.unit]") that contains neither an *export-keyword* nor a [*module-partition*](#nt:module-partition "10.1 Module units and purviews [module.unit]") implicitly imports the primary module interface unit of the module
|
||
as if by a [*module-import-declaration*](module.import#nt:module-import-declaration "10.3 Import declaration [module.import]")[.](#8.sentence-1)
|
||
|
||
[*Example [2](#example-2)*:
|
||
|
||
Translation unit #1:module B:Y; // does not implicitly import Bint y();
|
||
|
||
Translation unit #2:export module B;import :Y; // OK, does not create interface dependency cycleint n = y();
|
||
|
||
Translation unit #3:module B:X1; // does not implicitly import Bint &a = n; // error: n not visible here
|
||
|
||
Translation unit #4:module B:X2; // does not implicitly import Bimport B;int &b = n; // OK
|
||
|
||
Translation unit #5:module B; // implicitly imports Bint &c = n; // OK â *end example*]
|