[expr.prim.splice] Should variable-template splice specializations be constified in contract predicates?
Nobody has claimed this yet.
- Dominant language
- TeX
- Stars
- 221
- Forks
- 813
- Avg merge
- 16h 4m
- Merged PRs (30d)
- 36
Description
Subclause: [expr.prim.splice]
P3598R0, resolving CWG3158, added contract-predicate constification for the plain splice-specifier form. However, the variable-template splice-specialization-specifier form from P2996R13 still says unconditionally that the expression has the same type as the selected specialization.
For example:
template<int I> int var = I;
void f()
pre(template [:^^var:]<0> == 0) // not constified: template splice-specialization-specifier
pre([:^^var<0>:] == 0); // constified: plain splice-specifier
| Expression | What is inside [: ... :] |
|---|---|
template [:^^var:]<0> |
Template var; <0> is outside the splice |
[:^^var<0>:] |
Specialization var<0>; <0> is inside the splice |
Both expressions refer to var<0>. Is this difference intentional?
The difference affects well-formedness: only the specialization form can be used to modify the variable within the predicate.
void g()
pre((template [:^^var:]<0> = 1)) // well-formed: non-const lvalue, assignable
pre(([:^^var<0>:] = 1)); // ill-formed: const lvalue
If not, should the variable-template branch in [expr.prim.splice] apply the same shallow constification rule when the expression appears in a contract predicate?
Separately, that branch still says only “the object associated with S”. A reference variable-template specialization can instead refer to a function. That wording alignment seems independent of the constification question.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the expr.prim.splice subclause and compare the variable-template splice-specialization-specifier with the plain splice-specifier. Read P3598R0, P2996R13, and CWG3158, then determine whether both forms need the same contract-predicate constification and whether the reference-variable wording also needs alignment.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- documentation
- Issue type
- Documentation
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100