[module.interface] # 10 Modules [[module]](./#module) ## 10.2 Export declaration [module.interface] [export-declaration:](#nt:export-declaration "10.2 Export declaration [module.interface]") export [*name-declaration*](dcl.pre#nt:name-declaration "9.1 Preamble [dcl.pre]") export { [*declaration-seq*](dcl.pre#nt:declaration-seq "9.1 Preamble [dcl.pre]")opt } export-keyword [*module-import-declaration*](module.import#nt:module-import-declaration "10.3 Import declaration [module.import]") [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L206) An [*export-declaration*](#nt:export-declaration "10.2 Export declaration [module.interface]") shall inhabit a namespace scope and appear in the purview of a module interface unit[.](#1.sentence-1) An [*export-declaration*](#nt:export-declaration "10.2 Export declaration [module.interface]") shall not appear directly or indirectly within an unnamed namespace or a [*private-module-fragment*](module.private.frag#nt:private-module-fragment "10.5 Private module fragment [module.private.frag]")[.](#1.sentence-2) An [*export-declaration*](#nt:export-declaration "10.2 Export declaration [module.interface]") has the declarative effects of its[*name-declaration*](dcl.pre#nt:name-declaration "9.1 Preamble [dcl.pre]"),[*declaration-seq*](dcl.pre#nt:declaration-seq "9.1 Preamble [dcl.pre]") (if any), or[*module-import-declaration*](module.import#nt:module-import-declaration "10.3 Import declaration [module.import]")[.](#1.sentence-3) The [*name-declaration*](dcl.pre#nt:name-declaration "9.1 Preamble [dcl.pre]") of an [*export-declaration*](#nt:export-declaration "10.2 Export declaration [module.interface]") shall not declare a partial specialization ([[temp.decls.general]](temp.decls.general "13.7.1 General"))[.](#1.sentence-4) The [*declaration-seq*](dcl.pre#nt:declaration-seq "9.1 Preamble [dcl.pre]") of an [*export-declaration*](#nt:export-declaration "10.2 Export declaration [module.interface]") shall not contain an [*export-declaration*](#nt:export-declaration "10.2 Export declaration [module.interface]") or[*module-import-declaration*](module.import#nt:module-import-declaration "10.3 Import declaration [module.import]")[.](#1.sentence-5) [*Note [1](#note-1)*: An [*export-declaration*](#nt:export-declaration "10.2 Export declaration [module.interface]") does not establish a scope[.](#1.sentence-6) — *end note*] [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L227) A declaration is [*exported*](#def:declaration,exported "10.2 Export declaration [module.interface]") if it is declared within an [*export-declaration*](#nt:export-declaration "10.2 Export declaration [module.interface]") and inhabits a namespace scope or it is - [(2.1)](#2.1) a [*namespace-definition*](namespace.def.general#nt:namespace-definition "9.9.2.1 General [namespace.def.general]") that contains an exported declaration, or - [(2.2)](#2.2) a declaration within a header unit ([[module.import]](module.import "10.3 Import declaration")) that introduces at least one name[.](#2.sentence-1) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L238) If an exported declaration is not within a header unit, it shall not declare a name with internal linkage[.](#3.sentence-1) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L242) [*Example [1](#example-1)*: Source file "a.h":export int x; Translation unit #1:module;#include "a.h" // error: declaration of x is not in the// purview of a module interface unitexport module M;export namespace {} // error: namespace has internal linkagenamespace {export int a2; // error: export of name with internal linkage}export static int b; // error: b explicitly declared staticexport int f(); // OKexport namespace N { } // OKexport using namespace N; // OK — *end example*] [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L264) If an exported declaration is a [*using-declaration*](namespace.udecl#nt:using-declaration "9.10 The using declaration [namespace.udecl]") ([[namespace.udecl]](namespace.udecl "9.10 The using declaration")) and is not within a header unit, all entities named by the[*using-declarator*](namespace.udecl#nt:using-declarator "9.10 The using declaration [namespace.udecl]")*s* (if any) shall either be a type alias or have been introduced with a name having external linkage[.](#5.sentence-1) [*Example [2](#example-2)*: Source file "b.h":int f(); Importable header "c.h":int g(); Translation unit #1:export module X;export int h(); Translation unit #2:module;#include "b.h"export module M;import "c.h";import X;export using ::f, ::g, ::h; // OKstruct S;export using ::S; // error: S has module linkagenamespace N {export int h(); static int h(int); // #1}export using N::h; // error: #1 has internal linkage — *end example*] [*Note [2](#note-2)*: The underlying entity of an exported type alias need not have a name with external linkage[.](#5.sentence-2) [*Example [3](#example-3)*: export module M;struct S;export using T = S; // OK, exports name T denoting type S — *end example*] — *end note*] [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L313) A redeclaration of an entity X is implicitly exported if X was introduced by an exported declaration; otherwise it shall not be exported unless it is a type alias, a namespace, or a namespace alias[.](#6.sentence-1) [*Example [4](#example-4)*: export module M;struct S { int n; };typedef S S;export typedef S S; // OKexport struct S; // error: exported declaration follows non-exported declarationnamespace N { // external linkage, attached to global module, not exportedvoid f();}namespace N { // OK, exported namespace redeclaring non-exported namespaceexport void g();} — *end example*] [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L335) [*Note [3](#note-3)*: Names introduced by exported declarations have either external linkage or no linkage; see [[basic.link]](basic.link "6.7 Program and linkage")[.](#7.sentence-1) Namespace-scope declarations exported by a module can be found by name lookup in any translation unit importing that module ([[basic.lookup]](basic.lookup "6.5 Name lookup"))[.](#7.sentence-2) Class and enumeration member names can be found by name lookup in any context in which a definition of the type is reachable[.](#7.sentence-3) — *end note*] [*Example [5](#example-5)*: Interface unit of M:export module M;export struct X {static void f(); struct Y { };}; namespace {struct S { };}export void f(S); // OKstruct T { };export T id(T); // OKexport struct A; // A exported as incompleteexport auto rootFinder(double a) {return [=](double x) { return (x + a/x)/2; };}export const int n = 5; // OK, n has external linkage Implementation unit of M:module M;struct A {int value;}; Main program:import M;int main() { X::f(); // OK, X is exported and definition of X is reachable X::Y y; // OK, X​::​Y is exported as a complete typeauto f = rootFinder(2); // OKreturn A{45}.value; // error: A is incomplete} — *end example*] [8](#8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L386) [*Note [4](#note-4)*: Declarations in an exported [*namespace-definition*](namespace.def.general#nt:namespace-definition "9.9.2.1 General [namespace.def.general]") or in an exported [*linkage-specification*](dcl.link#nt:linkage-specification "9.12 Linkage specifications [dcl.link]") ([[dcl.link]](dcl.link "9.12 Linkage specifications")) are exported and subject to the rules of exported declarations[.](#8.sentence-1) [*Example [6](#example-6)*: export module M;int g;export namespace N {int x; // OKusing ::g; // error: ​::​g has module linkage} — *end example*] — *end note*]