Неважно, официально ли он действителен;вам следует избегать этого углового случая.
Я бы сказал, что «действительно ли это C ++» - это неправильный вопрос здесь.
Когда вы смотрите на кусок кода и, попробуйте, как можете,вы не можете решить, должен ли он быть действительным C ++ или нет;и вы знаете, что это будет какой-то угловой случай, в зависимости от точной формулировки стандарта - обычно хорошая идея не полагаться на этот угловой случай, так или иначе.Зачем?Потому что другие люди тоже запутаются;они будут тратить время, пытаясь понять, что вы имели в виду;они будут искать его в стандарте - или, что еще хуже, не искать его и делать неверные предположения;и они будут отвлекаться от того, на чем им действительно нужно сосредоточиться.
Итак, с этим кодом я бы спросил себя: «Является ли тип S
действительно закрытым? Неужели внешний код действительно не должен знать об этом?? "
Если ответ" Да, это так "- тогда я бы изменил f
, чтобы взять параметры для конструктора S (и переслать их в ctor):
void f(int t, int u) { S {t, u}; /* etc. etc. */ }
Если ответ «Нет, код, вызывающий f()
, может знать, что он передает ссылку S
» - тогда я сделаю S
общедоступным.