SFINAE с недопустимым функциональным типом или параметрами типа массива?

add_action( 'woocommerce_admin_order_data_after_order_details', 'warrenty_price_order_meta_general' );

function warrenty_price_order_meta_general( $order ){  ?>

        <br class="clear" />
        <h4>Gift Order <a href="#" class="edit_address">Edit</a></h4>
        <?php 
            /*
             * get all the meta data values we need
             */ 
            [110] 

Для электронной почты

add_action('woocommerce_email_order_meta', 'warrenty_price_email_order_meta', 10, 3);

function warrenty_price_email_order_meta($order_obj, $sent_to_admin, $plain_text) {


    $warrenty_price = get_post_meta($order_obj->get_id(), '_warrenty_price', true);

    if (empty($warrenty_price))
        return;

    if ($plain_text === false) {


        echo '<h2>Warranty</h2>
        <ul>
        <li><strong>Price:</strong> ' . $warrenty_price . '</li>
        </ul>';
    } else {

        echo "Warranty\n
        Price: $warrenty_price";
    }
}
warrenty_price = get_post_meta( $order->get_id(), '_warrenty_price', true ); ?> <div class="address"> <p><strong>Warranty</strong></p> <?php if( [110]

Для электронной почты

add_action('woocommerce_email_order_meta', 'warrenty_price_email_order_meta', 10, 3);

function warrenty_price_email_order_meta($order_obj, $sent_to_admin, $plain_text) {


    $warrenty_price = get_post_meta($order_obj->get_id(), '_warrenty_price', true);

    if (empty($warrenty_price))
        return;

    if ($plain_text === false) {


        echo '<h2>Warranty</h2>
        <ul>
        <li><strong>Price:</strong> ' . $warrenty_price . '</li>
        </ul>';
    } else {

        echo "Warranty\n
        Price: $warrenty_price";
    }
}
warrenty_price ) : ?> <p><strong>Price:</strong> <?php echo [110]

Для электронной почты

add_action('woocommerce_email_order_meta', 'warrenty_price_email_order_meta', 10, 3);

function warrenty_price_email_order_meta($order_obj, $sent_to_admin, $plain_text) {


    $warrenty_price = get_post_meta($order_obj->get_id(), '_warrenty_price', true);

    if (empty($warrenty_price))
        return;

    if ($plain_text === false) {


        echo '<h2>Warranty</h2>
        <ul>
        <li><strong>Price:</strong> ' . $warrenty_price . '</li>
        </ul>';
    } else {

        echo "Warranty\n
        Price: $warrenty_price";
    }
}
warrenty_price ?></p> <?php endif; ?> </div> <?php } ?>

Для электронной почты

add_action('woocommerce_email_order_meta', 'warrenty_price_email_order_meta', 10, 3);

function warrenty_price_email_order_meta($order_obj, $sent_to_admin, $plain_text) {


    $warrenty_price = get_post_meta($order_obj->get_id(), '_warrenty_price', true);

    if (empty($warrenty_price))
        return;

    if ($plain_text === false) {


        echo '<h2>Warranty</h2>
        <ul>
        <li><strong>Price:</strong> ' . $warrenty_price . '</li>
        </ul>';
    } else {

        echo "Warranty\n
        Price: $warrenty_price";
    }
}
22
задан Johannes Schaub - litb 5 May 2009 в 16:29
поделиться

3 ответа

Небольшая заметка, хотя и очень редкая, но я обнаружил несколько случаев, когда я считают, что компилятор Comeau ошибается - хотя эти случаи настолько редки, что всегда стоит вдвое и втрое проверяю ваши предположения!

Возможно, у меня есть причина поведения g ++. Я не уверен, что это точно указывается при настройке типов параметров:

Примите во внимание следующее:

template<typename T>
struct A
{
  void bar (T[10]);
};

template<typename T>
void A<T>::bar (T*)
{
}

Определение «bar» допустимо, поскольку «T [10]» распадается на «T *». я делаю не вижу в стандарте ничего, что запрещает компилятору выполнение корректировок 8.3.5 относительно шаблона объявления, а также повышает производительность, когда дело доходит до сопоставления перегрузки.

Применяя это к вашему примеру, g ++ может рассматривать его как:

template<typename T>
char (&f( T* ))[1];

template<typename T>
char (&f(...))[2];

int main() { char c[sizeof(f<void()>(0)) == 2]; }

В приведенном выше замещаемом параметре является допустимый указатель на функция, а не массив функций.

Итак, вопрос для меня - есть ли что-то, что запрещает корректировки параметров функции (8.3.5) дважды?

Лично я считаю, что имеет смысл разрешить корректировки дважды, так как в противном случае это усложняет сопоставление шаблона функции overloads

В заключение, я думаю, что для g ++ допустимо выбрать первую перегрузку основываясь на том, как он обрабатывает параметры распадающегося массива, и Комо ошибается не иметь ошибки вывода для массива функций.

Конечно, теперь это означает, что (если Комо был исправлен), то каждый компилятор выбрал бы другую перегрузку и все равно был бы стандартом совместимый! : (

РЕДАКТИРОВАТЬ:

Чтобы проиллюстрировать мою точку зрения, рассмотрим следующий код:

template <typename T> void foo ( T * );
template <typename T> void foo ( T * const );
template <typename T> void foo ( T [] );
template <typename T> void foo ( T [10] );
template <typename T> void foo ( T [100] );

void bar () 
{
  foo < void() > ( 0 );
}

Здесь foo был объявлен и повторно объявлен несколько раз. Какое объявление и, следовательно, какой тип параметра, должен компилятор применять правила перечислен в 14.8.2?

Я хочу сказать, что стандарт ничего не говорит о вышеизложенном. Я бы также сказал, что любая формулировка по этому поводу должна была бы оставить это либо как «undefined», либо « "поведение, определяемое реализацией".

12
ответ дан 29 November 2019 в 05:51
поделиться

Довольно удивительно - это работает в VS2008. Я не думаю, что это обязательно свидетельствует о том, что это правильное поведение или нет ...

Visual Studio интерпретирует

char (&f(T[1]))[1];

как функцию, которая принимает массив размером 1 T и возвращает ссылку на массив символы размера 1.

1
ответ дан 29 November 2019 в 05:51
поделиться

Как правило, вы не можете редактировать файл на месте; это просто очень длинная последовательность символов, которая включает символы новой строки. Вы можете редактировать на месте, если ваши изменения не меняют количество символов в каждой строке.

следовательно, разрешение перегрузки возвращает вторую перегрузку. Я не верю, что программа плохо сформирована.

1
ответ дан 29 November 2019 в 05:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: