1. In 7.6.8, the algorithm for creating a KeyHolder states that:
If there are any key members, then remove the non-key members from FooKeyHolder. Otherwise do not remove any members.
This seems to say that if there are no fields marked as keys, leave all of them open to be able to be used as keys. That would be consistent with implied key behavior.
2. There is an example of implied @key in Annex D, where the TopicData types specify BuiltinTopicKey_t as a key, but the single member of BuiltinTopicKey_t is not marked as a key.
3. At the same time 7.2.2.4.4.4.8 says:
If a given type has no members designated as key members, then the type—and any DDS Topic that is constructed using it as its type it—has no key.
It also says that:
In the event that the type K of a key member of a given type T itself defines key members, only the key of K, and not any other of its members, shall be considered part of the key of T.
This doesn't go against implied keys, but would be a good place to mention them in addition to the previous sentence.
4. 7.3.1.2.1.3 says that:
To declare a member as part of the key, users shall apply the @key annotation...
7.2.2.4.4.4.8 and 7.3.1.2.1.3 seem to have been written under the assumption that @keys can't be implied. If the specification actually requires this, which it appears that it does given Annex D, then it should say so in those two sections.
Finally, a couple thoughts/questions came up about implied keys behavior since it is not defined in the spec:
1. Given a situation like:
@nested(TRUE)
struct A
{
@key(FALSE) long a1;
long a2;
}
;
@nested(FALSE)
struct B
{
@key A b1;
}
;
Shouldn’t a2 be the only element of the key of B, because we’re explicitly saying a1 isn’t part of the key?
2. Should implied key behavior (potentially including the behavior in the previous point) apply to union discriminators? For example:
@nested(TRUE)
union TestUnion switch (long)
{
// ...
};
@nested(TRUE)
union KeyedTestUnion switch (@key long) {
// ...
}
;
@nested(TRUE)
union KeyedFalseTestUnion switch (@key(FALSE) long)
{
// ...
}
;
@nested(TRUE)
struct A
{
TestUnion a1; // discriminator is implied to be part of the key of B
KeyedTestUnion a2; // discriminator is explicitly part of the key of B
KeyedFalseTestUnion a3; // Not part of the key of B
}
;
@nested(FALSE)
struct B
{
@key TestUnion b1; // discriminator is implied to be part of the key
@key KeyedTestUnion b2; // discriminator is explicitly part of the key
@key KeyedFalseTestUnion b3; // Not part of the key, maybe an implementation could give a warning?
@key A b4;
}
;