Существует один пограничный случай, где статичный имеет удивительный эффект (по крайней мере, это было мне). C++ 03 Стандарта указывает в 14.6.4.2/1:
Для вызова функции, который зависит от шаблонного параметра, если имя функции неполный идентификатор , но не шаблонный идентификатор , функции кандидата найдены с помощью обычных правил поиска (3.4.1, 3.4.2) за исключением того, что:
- Для части поиска с помощью дисквалифицированного поиска имени (3.4.1), только объявления функции с внешней связью от шаблонного контекста определения найдены.
- Для части поиска с помощью связанных пространств имен (3.4.2), только объявления функции с внешней связью, найденной или в шаблонном контексте определения или в шаблонном контексте инстанцирования, найдены.
...
ниже кода будет звонить foo(void*)
а не foo(S const &)
, как Вы могли бы ожидать.
template <typename T>
int b1 (T const & t)
{
foo(t);
}
namespace NS
{
namespace
{
struct S
{
public:
operator void * () const;
};
void foo (void*);
static void foo (S const &); // Not considered 14.6.4.2(b1)
}
}
void b2()
{
NS::S s;
b1 (s);
}
Сам по себе это является, вероятно, не настолько большим соглашение, но оно действительно выделяет это для полностью совместимого компилятора C++ (т.е. один с поддержкой export
) static
, ключевое слово будет все еще иметь функциональность, которая не доступна никаким другим способом.
// bar.h
export template <typename T>
int b1 (T const & t);
// bar.cc
#include "bar.h"
template <typename T>
int b1 (T const & t)
{
foo(t);
}
// foo.cc
#include "bar.h"
namespace NS
{
namespace
{
struct S
{
};
void foo (S const & s); // Will be found by different TU 'bar.cc'
}
}
void b2()
{
NS::S s;
b1 (s);
}
единственный способ гарантировать, что функция в нашем пространстве имен без имени не будет найдена в шаблонах с помощью ADL, состоит в том, чтобы сделать его static
.
Обновление для современного C++
С C++ '11, у членов пространства имен без имени есть внутренняя связь неявно (3.5/4):
пространство имен без имени или пространство имен, объявленное прямо или косвенно в пространстве имен без имени, имеют внутреннюю связь.
, Но в то же время 14.6.4.2/1 был обновлен для удаления упоминания о связи (взятый от C++ '14):
Для вызова функции, где постфиксное выражение является зависимым именем, функции кандидата найдены с помощью обычных правил поиска (3.4.1, 3.4.2) за исключением того, что:
Для части поиска с помощью дисквалифицированного поиска имени (3.4.1), только объявления функции от шаблонного контекста определения найдены.
Для части поиска с помощью связанных пространств имен (3.4.2), только объявления функции, найденные или в шаблонном контексте определения или в шаблонном контексте инстанцирования, найдены.
результат состоит в том, что это конкретное различие между статическими и участниками пространства имен без имени больше не существует.
Если у Вас есть file_field тогда, он подчиняется как HTML, даже когда remote: true
- взял меня долгое время, чтобы разработать это так, я добавляю этот ответ, чтобы, возможно, сэкономить кому-то еще время, есть решение, используйте remotipart драгоценный камень, см. ответ здесь