Параметр шаблона зависит от [[nodiscard]] - PullRequest
7 голосов
/ 12 июня 2019

У меня есть функциональный объект, который является оберткой вокруг другой функции:

template <typename FuncT>
class Wrapper
{
    private:
        FuncT funcToWrap;

    public:
        Wrapper(FuncT ftw) : funcToWrap(ftw){};

        template<typename ...ARG>
        typename std::result_of<FuncT(ARG&&...)>::type operator()(ARG&&... args){
            return funcToWrap(std::forward<ARG>(args)...);
        }
};

int main(){
    std::function<void()> testfunc = [](){ std::cout << "Test" << std::endl; };
    Wrapper<decltype(testfunc)> test{testfunc};
    test();
}

Я хотел бы отметить operator() как [[nodiscard]], если std::result_of<FuncT(ARG&&...)>::type не void.

Что я заметил, так это то, что когда я ставлю [[nodiscard]] в случае оценки шаблона возвращаемого типа на void, он просто игнорируется моим компилятором.

Это поведение, на которое я могу положиться, оно каким-либо образом стандартизировано?

1 Ответ

0 голосов
/ 12 июня 2019

Per [dcl.attr.nodiscard] / 2 :

[ Примечание: Вызов nodiscard - это выражение вызова функции, которое вызывает функциюранее объявленный nodiscard, или тип возвращаемого значения которого является, возможно, cv-квалифицированным классом или типом перечисления, помеченным nodiscard.Появление вызова nodiscard как потенциально оцененного выражения отбрасываемого значения не рекомендуется, если явно не приведено к void.Реализации должны выдавать предупреждение в таких случаях.Обычно это происходит потому, что отбрасывание возвращаемого значения вызова nodiscard имеет удивительные последствия.- конец примечания ]

Мое прочтение этого параграфа дает, что, учитывая,

[[nodiscard]] void f() {}

даже

f();

должен выдатьпредупреждение.Вы должны явно привести к void, как в

(void) f();

, чтобы подавить его.Так что нет, это не гарантируется стандартом.

Мне кажется, что стандарт просто упустил из виду эту тонкость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...